zoukankan      html  css  js  c++  java
  • XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大。
    作用有:
    ①定义可出现在文档中的元素
    ②定义可出现在文档中的属性
    ③定义哪个元素是子元素
    ④定义子元素的次序
    ⑤定义子元素的数目
    ⑥定义元素是否为空,或者是否可包含文本
    ⑦定义元素和属性的数据类型
    ⑧定义元素和属性的默认值以及固定值

    XSD元素可分为简单元素和复杂元素。

    一、简单元素
    简易元素指仅包含文本的元素,它不会包含任何其他的元素或属性。
    例如XML文档:
    <Name>张三</Name>
    用XSD可写为
    <xs:element name="Name" type="xs:string"/>
    此处“Name”是元素的名称,“xs:string”是XML Schema内建的数据类型。
    最常用的类型有:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、xs:time等。

    如果要指定元素的默认值或固定值,默认值用default定义,固定值用fixed定义。
    <xs:element name="Name" type="xs:string" default="张三"/>
    <xs:element name="Name" type="xs:string" fixed="张三"/>

    也可限定元素的取值范围,例如限定字符串的长度为2至4,则可写为如下:
    <xs:element name="Name">
         <xs:simpleType>
              <xs:restriction base="xs:string">
                    <xs:minLength value="2" />
                     <xs:maxLength value="4" />
               </xs:restriction>
         </xs:simpleType>
    </xs:element>

    也可以写成:
    <xs:element name="Name" type="tns:T_Name" />

    <xs:simpleType name="T_Name">
        <xs:restriction base="xs:string">
          <xs:minLength value="2" />
          <xs:maxLength value="4" />
        </xs:restriction>
    </xs:simpleType>

    二、复合元素
    复合元素包含了其他的元素及/或属性。
    有四种类型的复合元素:
    ①空元素
    ②包含其他元素的元素
    ③仅包含文本的元素
    ④包含元素和文本的元素

    一个XML代码:
     <Person id="1">
         <Name>张三</Name>  
         <Age>120</Age>  
      </Person>  

    在 XML Schema 中,可定义为:
    <xs:element name="Person" maxOccurs="unbounded">
         <xs:complexType>
                <xs:sequence>
                  <xs:element name="Name" type="xs:string" />
                  <xs:element name="Age" type="xs:string" />               
                </xs:sequence>
                <xs:attribute name="id" type="xs:int" use="required" />
        </xs:complexType>
    </xs:element>

    一些用法说明:
    1、maxOccurs="unbounded"
    maxOccurs为Occurrence 指示器,Occurrence 指示器用于定义某个元素出现的频率,有2种类型分别是 maxOccurs和minOccurs ,默认值均为 1。
    maxOccurs 指示器:规定某个元素可出现的最大次数
    如<xs:element name="Name" type="xs:string" maxOccurs="10"/>
    规定元素“Name”最少出现一次(其中 minOccurs 的默认值是 1),最多出现 10 次。
    minOccurs 指示器:规定某个元素能够出现的最小次数
    如<xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="10"/>
    规定元素“Name”最少出现0次,最多出现 10 次。

    提示:如需使某个元素的出现次数不受限制,使用 maxOccurs="unbounded" 这个声明
    上面<xs:element name="Person" maxOccurs="unbounded">表示元素“Person”出现次数最少一次(其中 minOccurs 的默认值是 1),并且任意次数。

    2、<xs:sequence>
    <xs:sequence>为“Order 指示器”,Order 指示器用于定义元素的顺序,有3种类型分别是All、Choice、Sequence。
    all 指示器:规定子元素可以按照任意顺序出现
    Choice 指示器:规定可出现某个子元素或者可出现另外一个子元素(非此即彼)
    Sequence 指示器:规定子元素必须按照特定的顺序出现

    上面例子代码用<xs:sequence>规定了子元素“Name”和“Age”必须按顺序出现。

    3、use="required"
    use 指示如何使用属性,有3种:
    optional :属性是可选的并且可以具有任何值。这是默认设置。
    <xs:attribute name="id" type="xs:int"/>等价于
    <xs:attribute name="id" type="xs:int" use="optional"/>
    可验证通过<Person>或<Person id="1">
    required :属性必须出现一次
    <xs:attribute name="id" type="xs:int" use="required"/>
    可验证通过<Person id="1">
    prohibited :不能使用属性。
    <xs:attribute name="id" use="prohibited"/>
    规定了不能使用id的属性。


    实例1(无引用命名空间):

    Persons.xml

    1. <?xml version="1.0" encoding="UTF-8"?>    
    2. <Persons>  
    3.   <Person id="1">  
    4.      <Name>张三</Name>    
    5.      <Age>120</Age>    
    6.   </Person>    
    7.   <Person id="2">    
    8.      <Name>李四</Name>    
    9.      <Age>20</Age>    
    10.   </Person>  
    11. </Persons>  

    Persons.xsd

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">  
    3.   
    4.   <xs:annotation>  
    5.     <xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>  
    6.   </xs:annotation>  
    7.   <xs:element name="Persons">  
    8.     <xs:complexType>  
    9.       <xs:sequence>  
    10.         <xs:element name="Person" maxOccurs="unbounded">  
    11.           <xs:complexType>  
    12.             <xs:sequence>  
    13.               <xs:element name="Name">  
    14.                 <xs:simpleType>  
    15.                   <xs:restriction base="xs:string">  
    16.                     <xs:minLength value="2" />  
    17.                     <xs:maxLength value="4" />  
    18.                   </xs:restriction>  
    19.                 </xs:simpleType>  
    20.               </xs:element>  
    21.               <xs:element name="Age">  
    22.                 <xs:simpleType>  
    23.                   <xs:restriction base="xs:string">  
    24.                     <xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />  
    25.                   </xs:restriction>  
    26.                 </xs:simpleType>  
    27.               </xs:element>  
    28.             </xs:sequence>        
    29.             <xs:attribute name="id" use="required">  
    30.                <xs:simpleType>  
    31.                 <xs:restriction base="xs:int"></xs:restriction>  
    32.               </xs:simpleType>  
    33.             </xs:attribute>  
    34.           </xs:complexType>  
    35.         </xs:element>  
    36.       </xs:sequence>  
    37.     </xs:complexType>  
    38.   </xs:element>  
    39.   
    40. </xs:schema>  


    实例2(有引用命名空间):

    Persons2.xml

    1. <?xml version="1.0" encoding="UTF-8"?>    
    2. <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xxx.com/XxxSystem">  
    3.   <Person id="1">  
    4.      <Name>张三</Name>    
    5.      <Age>120</Age>    
    6.   </Person>    
    7.   <Person id="2">    
    8.      <Name>李四</Name>    
    9.      <Age>20</Age>    
    10.   </Person>  
    11. </Persons>   

    Persons2.xsd

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <xs:schema elementFormDefault="qualified"  
    3.   xmlns:xs="http://www.w3.org/2001/XMLSchema"  
    4.   xmlns:tns="http://www.xxx.com/XxxSystem" >  
    5.   
    6.   <xs:annotation>  
    7.     <xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>  
    8.   </xs:annotation>  
    9.   
    10.   <xs:annotation>  
    11.     <xs:documentation>姓名</xs:documentation>  
    12.   </xs:annotation>  
    13.   <xs:simpleType name="T_Name">  
    14.     <xs:restriction base="xs:string">  
    15.       <xs:minLength value="2" />  
    16.       <xs:maxLength value="4" />  
    17.     </xs:restriction>  
    18.   </xs:simpleType>  
    19.   <xs:annotation>  
    20.     <xs:documentation>年龄</xs:documentation>  
    21.   </xs:annotation>  
    22.   <xs:simpleType name="T_Age">  
    23.     <xs:restriction base="xs:string">  
    24.       <xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />  
    25.     </xs:restriction>  
    26.   </xs:simpleType>  
    27.   <xs:annotation>  
    28.     <xs:documentation>属性ID</xs:documentation>  
    29.   </xs:annotation>  
    30.   <xs:simpleType name="T_id">  
    31.     <xs:restriction base="xs:int"></xs:restriction>  
    32.   </xs:simpleType>  
    33.   
    34.   <xs:element name="Persons">  
    35.     <xs:complexType>  
    36.       <xs:sequence>  
    37.         <xs:element name="Person" maxOccurs="unbounded" type="tns:T_Person"/>  
    38.       </xs:sequence>  
    39.     </xs:complexType>  
    40.   </xs:element>  
    41.   
    42.   <xs:complexType name="T_Person">  
    43.     <xs:sequence>  
    44.       <xs:element name="Name" type="tns:T_Name" />  
    45.       <xs:element name="Age" type="tns:T_Age" />  
    46.     </xs:sequence>  
    47.     <xs:attribute name="id" type="tns:T_id" use="required" />  
    48.   </xs:complexType>  
    49.   
    50. </xs:schema>  


    C# 使用xsd文件验证XML文件格式

    1. /// <summary>  
    2.         /// 通过xsd验证xml格式是否正确,正确返回空字符串,错误返回提示  
    3.         /// </summary>  
    4.         /// <param name="xmlFile">xml文件</param>  
    5.         /// <param name="xsdFile">xsd文件</param>  
    6.         /// <param name="namespaceUrl">命名空间,无则默认为null</param>  
    7.         /// <returns></returns>  
    8.         public static string XmlValidationByXsd(string xmlFile, string xsdFile, string namespaceUrl = null)  
    9.         {  
    10.             StringBuilder sb = new StringBuilder();            
    11.             XmlReaderSettings settings = new XmlReaderSettings();  
    12.             settings.ValidationType = ValidationType.Schema;  
    13.             settings.Schemas.Add(namespaceUrl, xsdFile);  
    14.             settings.ValidationEventHandler += (x,y)=>  
    15.             {  
    16.                 sb.AppendFormat("{0}|", y.Message);  
    17.             };  
    18.             using (XmlReader reader = XmlReader.Create(xmlFile, settings))  
    19.             {  
    20.                 try  
    21.                 {  
    22.                     while (reader.Read());                    
    23.                 }  
    24.                 catch (XmlException ex)  
    25.                 {  
    26.                     sb.AppendFormat("{0}|", ex.Message);  
    27.                 }  
    28.             }  
    29.             return sb.ToString();  
    30.         }  


    2013-10-17备注

    上面代码是验证xml文件,如果是xml字符串,则可用下面:

      1. /// <summary>  
      2.        /// 通过xsd验证xml格式是否正确,正确返回空字符串,错误返回提示  
      3.        /// </summary>  
      4.        /// <param name="xmlText">xml文本内容</param>  
      5.        /// <param name="schemaFile">xsd文件</param>  
      6.        /// <returns></returns>  
      7.        public static string XmlValidateByXsd(string xmlText, string schemaFile)  
      8.        {  
      9.            StringBuilder sb = new StringBuilder();  
      10.            XmlReaderSettings settings = new XmlReaderSettings();  
      11.            settings.ValidationType = ValidationType.Schema;  
      12.            settings.Schemas.Add(null, schemaFile);  
      13.            settings.ValidationEventHandler += (x, y) =>  
      14.            {  
      15.                sb.AppendFormat("{0} ", y.Message);  
      16.            };  
      17.            using (XmlReader reader = XmlReader.Create(new StringReader(xmlText), settings))  
      18.            {  
      19.                try  
      20.                {  
      21.                    while (reader.Read()) ;  
      22.                }  
      23.                catch (XmlException ex)  
      24.                {  
      25.                    sb.AppendFormat("{0} ", ex.Message);  
      26.                }  
      27.            }  
      28.            return sb.ToString();  
      29.        } 
  • 相关阅读:
    通用权限管理设计 之 数据库结构设计
    jQuery LigerUI 插件介绍及使用之ligerDateEditor
    jQuery LigerUI 插件介绍及使用之ligerTree
    jQuery LigerUI V1.01(包括API和全部源码) 发布
    jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载)
    jQuery LigerUI V1.1.5 (包括API和全部源码) 发布
    jQuery LigerUI 使用教程表格篇(1)
    jQuery LigerUI V1.0(包括API和全部源码) 发布
    jQuery LigerUI V1.1.0 (包括API和全部源码) 发布
    nginx keepalived
  • 原文地址:https://www.cnblogs.com/haofaner/p/6140851.html
Copyright © 2011-2022 走看看