首页 新闻 会员 周边

C# xsd验证xml文件问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-07-01 10:52

源码:
========================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Xml;
using System.Xml.Schema;
using System.IO;

namespace XsdXmlSample
{
    class Program
    {
        const string XML_FILE_NAME = "PRItems.xml";
        const string SCHEMA_FILE_NAME = "Schema.xsd";

        static void Main(string[] args)
        {

            if (ValidateXML(XML_FILE_NAME,SCHEMA_FILE_NAME))
            {
                Console.WriteLine("Validate Sucess!");
                Console.ReadLine();
            }

        }



        static bool ValidateXML(string xmlFile,string schemaFile)
        {
            bool isValid = true;

            try
            {
                //
                XmlSchemaSet schemaSet = new XmlSchemaSet();
                schemaSet.Add(null,schemaFile);
                XmlReaderSettings readerSetting = new XmlReaderSettings();
                readerSetting.ValidationType = ValidationType.Schema;                
                readerSetting.Schemas = schemaSet;

                //
                using (XmlReader xmlReader = XmlReader.Create(xmlFile, readerSetting))
                {
                    while (xmlReader.Read())
                    {  }
                }

            }
            catch (Exception ex)
            {
                isValid = false;
                Console.WriteLine("Validate Failure! Error: {0}",ex.Message);
            }

            return isValid;
        }

    }
}
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="PRItemSchema"
    targetNamespace="http://tempuri.org/schema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/schema.xsd"
    xmlns:mstns="http://tempuri.org/schema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="PRItem">
    <xs:complexType>
      <xs:group ref="ItemGroup" minOccurs="1" maxOccurs="unbounded" />
    </xs:complexType>
  </xs:element>

  <xs:group name="ItemGroup">
    <xs:sequence>
      <xs:element name="Item">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Company" type="xs:string" />
            <xs:element name="PR_No" type="xs:string" />
            <xs:element name="PR_Line" type="xs:int" />
            <xs:element name="PO_No" type="xs:string" />
            <xs:element name="PR_Complete" type="xs:boolean" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>  
  </xs:group>
</xs:schema>
<?xml version="1.0" encoding="utf-8" ?>
<PRItem>
  <Item>
    <Company>KK-GZ</Company>
    <PR_No>PP-2012063001</PR_No>
    <PR_Line>200</PR_Line>
    <PR_Complete>True</PR_Complete>
    <PO_No>PX-2012063001</PO_No>
  </Item>
  <Item>
    <Company>KK-GZ</Company>
    <PR_No>PP-2012063002</PR_No>
    <PR_Line>232</PR_Line>
    <PR_Complete>False</PR_Complete>
    <PO_No>PX-2012063002</PO_No>
  </Item>
</PRItem>

========================================================

OK,我们进入问题:

小弟的疑惑的就是,不论我怎么改变我的XML文件结构,我得到的结果都是Validate Success!


例子:

<?xml version="1.0" encoding="utf-8" ?>
<PRItem>

</PRItem>

***********************************************
通过!!!


<?xml version="1.0" encoding="utf-8" ?>
<PRItem>
  <Item>

    <PR_Complete>True</PR_Complete>
    <PO_No>PX-2012063001</PO_No>
  </Item>
  <Item>
    <Company>KK-GZ</Company>
    <PR_No>PP-2012063002</PR_No>

  </Item>
</PRItem>

***********************************************
又通过!!!


<?xml version="1.0" encoding="utf-8" ?>
<OK></OK>

***********************************************
还通过!!!

Oh,Shit . 我无语了。。。

 

事实告诉我:好像xsd验证没有起到任何效果,就像没有进行验证过一样。
大家都知道 如果我的xml格式与xsd文件描述不一样的话是会抛出异常的,
在我的try catch里面就可以捕捉然后就可以判断是否验证通过。。。

小弟是第一次弄这个东西,请大家帮忙看看代码,我实在看不出问题。。。
大家帮忙分析分析。。。验证原理我是清楚了,我就奇怪我这段代码,为什么
没有效果???

 

小弟在此先谢过各位!

 

 

kaleyroy的主页 kaleyroy | 菜鸟二级 | 园豆:360
提问于:2012-07-01 01:47
< >
分享
最佳答案
0

http://www.cnblogs.com/Teco/archive/2012/03/24/2415693.html也許 能幫助你。

<xs:schema id="PRItemSchema"
    targetNamespace="http://tempuri.org/schema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/schema.xsd"
    xmlns:mstns="http://tempuri.org/schema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
設置 好像不正確哦。自己 修改 調試一下。
收获园豆:8
無限遐想 | 老鸟四级 |园豆:3740 | 2012-07-01 09:17

非常感谢你的文章,问题解决了!

<?xml version="1.0" encoding="utf-8" ?>
<PRItem xmlns="http://tempuri.org/schema.xsd" >
  <Item>
    <Company>KK-GZ</Company>
    <PR_No>PP-2012063001</PR_No>
    <PR_Line>200</PR_Line>
    <PO_No>PX-2012063001</PO_No>
    <PR_Complete>true</PR_Complete>    
  </Item>
  <Item>
    <Company>KK-GZ</Company>
    <PR_No>PP-2012063002</PR_No>
    <PR_Line>232</PR_Line>
    <PO_No>PX-2012063001</PO_No>
    <PR_Complete>false</PR_Complete>
  </Item>
</PRItem>

 

原来我是没有引用验证的Schema文件 NameSpaces :
"xmlns="http://tempuri.org/schema.xsd"

XmlReader 在执行验证的时候不光需要xsd文件,还需要xml文件显示的
引用xsd的NameSpaces,这样才就可以去匹配验证每个元素。。。

kaleyroy | 园豆:360 (菜鸟二级) | 2012-07-01 10:50
其他回答(1)
0

没这样使用过,所以没办法帮你解决,不过,假如是DATASET,可以new一个DATASET来验证看。

 

另外,检查下xmlReader的read结果看?也许这里的某一个参数的默认配置是忽略错误呢?

收获园豆:2
无之无 | 园豆:5095 (大侠五级) | 2012-07-01 08:19

谢谢!

支持(0) 反对(0) kaleyroy | 园豆:360 (菜鸟二级) | 2012-07-01 10:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册