XSD(XML Schema Definition)用法實例介紹以及C#使用xsd文件驗證XML格式

XML Schema 語言也稱做 XML Schema 定義(XML Schema Definition,XSD),做用是定義 XML 文檔的合法構建模塊,相似 DTD,但更增強大。
做用有:
①定義可出如今文檔中的元素
②定義可出如今文檔中的屬性
③定義哪一個元素是子元素
④定義子元素的次序
⑤定義子元素的數目
⑥定義元素是否爲空,或者是否可包含文本
⑦定義元素和屬性的數據類型
⑧定義元素和屬性的默認值以及固定值

XSD元素可分爲簡單元素和複雜元素。

1、簡單元素
簡易元素指僅包含文本的元素,它不會包含任何其餘的元素或屬性。
例如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>

2、複合元素
複合元素包含了其餘的元素及/或屬性。
有四種類型的複合元素:
①空元素
②包含其餘元素的元素
③僅包含文本的元素
④包含元素和文本的元素

一個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>

一些用法說明:
一、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),而且任意次數。

二、<xs:sequence>
<xs:sequence>爲「Order 指示器」,Order 指示器用於定義元素的順序,有3種類型分別是All、Choice、Sequence。
all 指示器:規定子元素能夠按照任意順序出現
Choice 指示器:規定可出現某個子元素或者可出現另一個子元素(非此即彼)
Sequence 指示器:規定子元素必須按照特定的順序出現

上面例子代碼用<xs:sequence>規定了子元素「Name」和「Age」必須按順序出現。

三、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
html

  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
ui

  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
spa

  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
.net

  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文件格式
rest

  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備註orm

上面代碼是驗證xml文件,若是是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}\n", 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}\n", ex.Message);  
    26.                }  
    27.            }  
    28.            return sb.ToString();  
    29.        } 
相關文章
相關標籤/搜索