• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

XSD(XMLSchemaDefinition)用法实例介绍以及C#使用xsd文件验证XML格式

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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 >实例1(无命名空间):

Persons.xml

<?xml version="1.0" encoding="UTF-8"?>  
<Persons>
  <Person >
     <Name>张三</Name>  
     <Age>120</Age>  
  </Person>  
  <Person >  
     <Name>李四</Name>  
     <Age>20</Age>  
  </Person>
</Persons> 

 Persons.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:annotation>
    <xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>
  </xs:annotation>
  <xs:element name="Persons">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Person" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <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="Age">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:sequence>      
            <xs:attribute name="id" use="required">
               <xs:simpleType>
                <xs:restriction base="xs:int"></xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

 

实例2(有命名空间):

Persons2.xml

<?xml version="1.0" encoding="UTF-8"?>  
<Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xxx.com/XxxSystem">
  <Person >
     <Name>张三</Name>  
     <Age>120</Age>  
  </Person>  
  <Person >  
     <Name>李四</Name>  
     <Age>20</Age>  
  </Person>
</Persons> 

 Persons2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="http://www.xxx.com/XxxSystem" >

  <xs:annotation>
    <xs:documentation> 本文档定义Persons.xml的格式 </xs:documentation>
  </xs:annotation>

  <xs:annotation>
    <xs:documentation>姓名</xs:documentation>
  </xs:annotation>
  <xs:simpleType name="T_Name">
    <xs:restriction base="xs:string">
      <xs:minLength value="2" />
      <xs:maxLength value="4" />
    </xs:restriction>
  </xs:simpleType>
  <xs:annotation>
    <xs:documentation>年龄</xs:documentation>
  </xs:annotation>
  <xs:simpleType name="T_Age">
    <xs:restriction base="xs:string">
      <xs:pattern value="[1-9][0-9]?|1[01][0-9]|120" />
    </xs:restriction>
  </xs:simpleType>
  <xs:annotation>
    <xs:documentation>属性ID</xs:documentation>
  </xs:annotation>
  <xs:simpleType name="T_id">
    <xs:restriction base="xs:int"></xs:restriction>
  </xs:simpleType>

  <xs:element name="Persons">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Person" maxOccurs="unbounded" type="tns:T_Person"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="T_Person">
    <xs:sequence>
      <xs:element name="Name" type="tns:T_Name" />
      <xs:element name="Age" type="tns:T_Age" />
    </xs:sequence>
    <xs:attribute name="id" type="tns:T_id" use="required" />
  </xs:complexType>

</xs:schema>

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

/// <summary>
        /// 通过xsd验证xml格式是否正确,正确返回空字符串,错误返回提示
        /// </summary>
        /// <param name="xmlFile">xml文件</param>
        /// <param name="xsdFile">xsd文件</param>
        /// <param name="namespaceUrl">命名空间,无则默认为null</param>
        /// <returns></returns>
        public static string XmlValidationByXsd(string xmlFile, string xsdFile, string namespaceUrl = null)
        {
            StringBuilder sb = new StringBuilder();          
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas.Add(namespaceUrl, xsdFile);
            settings.ValidationEventHandler += (x,y)=>
            {
                sb.AppendFormat("{0}|", y.Message);
            };
            using (XmlReader reader = XmlReader.Create(xmlFile, settings))
            {
                try
                {
                    while (reader.Read());                  
                }
                catch (XmlException ex)
                {
                    sb.AppendFormat("{0}|", ex.Message);
                }
            }
            return sb.ToString();
        }

 






鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#String.Format用法和格式说明发布时间:2022-07-10
下一篇:
C#FOR循环语句——打印五角星和菱形发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap