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.        } 
  • 相关阅读:
    win10 访问远程文件夹 此共享需要过时的SMB1协议 你不能访问此共享文件夹
    Navicat 1142 SELECT command denied to user 'sx'@'xxx' for table 'user'
    MySQL 密码参数配置与修改 validate_password
    MySQL 命令行下更好的显示查询结果
    MySQL 数据库的存储结构
    MySQL实验 内连接优化order by+limit 以及添加索引再次改进
    MySQL实验 子查询优化双参数limit
    MySQL 索引结构 hash 有序数组
    MySQL 树形索引结构 B树 B+树
    hbase2.1.9 centos7 完全分布式 搭建随记
  • 原文地址:https://www.cnblogs.com/haofaner/p/6140851.html
Copyright © 2011-2022 走看看