我做的XML验证的测试记录

1、XML文件
1 <?xml version="1.0" encoding="utf-8" ?>
2 <图书流通信息 
3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4     xmlns="http://tempuri.org/demo1.xsd"  
5     xsi:schemaLocation="http://tempuri.org/demo1.xsd demo1.xsd"
6     Maker="1" attribute1="dd">
7 <传送标题>test</传送标题>
8 </图书流通信息>
说明:
        第一行声明XML版本,字符集
        第二行文档元素或根元素 起始
        第三行使用xmlns定义名称空间"http://www.w3.org/2001/XMLSchema-instance",及使用别名xsi
        第三行使用xmlns定义名称空间"http://tempuri.org/demo1.xsd",注:因没有指定别名,故为缺省名称空间。
        第四行使用xsi:schemaLocation定义名称空间"http://tempuri.org/demo1.xsd"的XML Schema(XSD)为XML文件缺省目录下的demo1.xsd文件。
另:如果使用XDR时这里的定义为:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <图书流通信息 
3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4     xmlns="x-schema:demo1.xdr" >
5 <传送标题>test</传送标题>dd
6 </图书流通信息>

        第五行定义根元素的两个属性。
        略。

2、XML Schema文件(使用VS可视化定义的,不解释了)
 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <xs:schema id="demo1" targetNamespace="http://tempuri.org/demo1.xsd" elementFormDefault="qualified"
 3     xmlns="http://tempuri.org/demo1.xsd" xmlns:mstns="http://tempuri.org/demo1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 4     <xs:element name="图书流通信息">
 5         <xs:complexType>
 6             <xs:sequence>
 7                 <xs:element name="传送标题" type="xs:string" minOccurs="1" maxOccurs="1" />
 8             </xs:sequence>
 9             <xs:attribute name="Maker" type="xs:int" use="required" />
10             <xs:attribute name="attribute1" type="xs:string" use="required" />
11         </xs:complexType>
12     </xs:element>
13 </xs:schema>

3、验证(测试使用的是WebServices)
 1         [WebMethod]
 2         public string doDemo1Validating()
 3         {
 4            
 5             ErrorMessage="OK";
 6             //表示提供对 XML 数据进行快速、非缓存、只进访问的读取器。
 7             XmlTextReader xtr = new XmlTextReader("C:\\Inetpub\\wwwroot\\WebService1\\demo1.xml");
 8             //表示提供 DTD、XML 数据简化 (XDR) 架构和 XML 架构定义语言 (XSD) 架构验证的读取器。
 9             XmlValidatingReader xvr = new XmlValidatingReader(xtr);
10 
11             //获取一个值,该值描述要执行哪种类型的验证。
12             xvr.ValidationType = ValidationType.Schema;
13             //设置事件处理程序以接收有关 DTD、XML 数据简化 (XDR) 架构和 XML 架构定义语言 (XSD) 架构验证错误的信息。
14             xvr.ValidationEventHandler+=new ValidationEventHandler(xvr_ValidationEventHandler);//按两下TAB可以自动生成委托代码
15             
16             //从流中如果成功读取了下一个节点,则为 true;如果没有其他节点可读取,则为 false。
17             while (xvr.Read())
18             {
19                 if (xvr.SchemaType!=null)
20                 {
21                     //简单类型
22                     if (xvr.SchemaType is XmlSchemaDatatype || xvr.SchemaType is  XmlSchemaSimpleType)
23                     {
24                         Object value = xvr.ReadTypedValue();
25                         //结点类型xvr.NodeType
26                         //结点限定名称xvr.Name
27                         //xsd定义的类型value.GetType
28                     }
29                         //复杂类型
30                     else if (xvr.SchemaType is XmlSchemaComplexType)
31                     {
32                         XmlSchemaComplexType sct = (XmlSchemaComplexType)xvr.SchemaType;
33                         //结点类型xvr.NodeType
34                         //结点限定名称xvr.Name
35                         //xsd定义的类型value.GetType
36                     }
37 
38                     //如果结点是元素
39                     if (xvr.NodeType ==  XmlNodeType.Element)
40                     {
41                         while(xvr.MoveToNextAttribute())//逐个取出当前元素下的属性
42                         {
43                             //同上一个IF
44                         }
45                     }
46                 }
47             }
48             xvr.Close();
49             xtr.Close();
50             return ErrorMessage;
51 
52         }
53 
54         private void xvr_ValidationEventHandler(object sender, ValidationEventArgs e)
55         {
56             //验证错误
57             //显示错误信息 e.Message();
58            ErrorMessage = e.Message;
59         }

说明:
验证类型(ValidationType)分四种:Auto\DTD\Schema\XDR\None

Schema=XSD,它与XDR有什么区别?我不明白。
DELPH的工具XmlMapper可以将XML文件装入后生成DTD\XDR\XSD
好像XDR是Microsoft的东西
XDR=XML Data Reduced

原文地址:https://www.cnblogs.com/ZhouXiHong/p/315945.html