XML-Schema验证

Posted 韩信断了枪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML-Schema验证相关的知识,希望对你有一定的参考价值。

Schema

什么是Schema

Schema(模式) :其作用与DTD一样,也是用于验证XML文档的有效性,只不过它提供了比DTD更强大的功能和更细粒度的数据类型。另外,Schema可以自定义数据类型。

Schema也是一个XML文件,而DTD则不是。

Schema与DTD的比较

  

为何要Schema

Schema文档结构:

 

 

所有的Schema文档,其根元素必须叫schema。schema可以包含属性,比如:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

...
...
</xs:schema>

一个Schema的例子

新建一个dtd文件

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="name" type="xs:string"></xs:element>
    <xs:element name="health" type="xs:int"></xs:element>
    <xs:element name="love" type="xs:int"></xs:element>
    <xs:element name="strain" type="xs:string"></xs:element>
    <xs:group name="mygroup" >
        <xs:sequence>
            <xs:element ref="name"></xs:element>
            <xs:element ref="health"></xs:element>
            <xs:element ref="love"></xs:element>
            <xs:element ref="strain"></xs:element>
        </xs:sequence>
    </xs:group>
  <!--定义一个复合类型--> <xs:complexType name="dogType"> <xs:group ref="mygroup"></xs:group> </xs:complexType> <xs:element name="dog" type="dogType"></xs:element> </xs:schema>

根据以上dtd写的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<dog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\\Users\\x\\Desktop\\schema\\my3.xsd">
    <name>安倍晋三</name>
    <health>0</health>
    <love>0</love>
    <strain>草狗</strain>
</dog>

Schema的数据类型

基本数据类型

扩展数据类型

其它数据类型

数据类型的约束

 

规则

Schema的元素类型

schema元素:

作用:包含已经定义的schema
用法:<xs:schema>
属性:xmlns                targetNamespace             elementFormDefault           attributeFormDefault
 

Element元素

group元素

attribute元素

attributeGroup元素

综合案例:

Schema

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="name" type="xs:string"></xs:element>
    <xs:element name="health" type="xs:int"></xs:element>
    <xs:element name="love" type="xs:int"></xs:element>
    <xs:element name="strain" type="xs:string"></xs:element>
    <xs:group name="mygroup" >
        <xs:sequence>
            <xs:element ref="name"></xs:element>
            <xs:element ref="health"></xs:element>
            <xs:element ref="love"></xs:element>
            <xs:element ref="strain"></xs:element>
        </xs:sequence>
    </xs:group>
    <xs:attribute name="id" type="xs:string"></xs:attribute>
    <xs:attribute name="color" type="xs:string"></xs:attribute>
    <xs:attributeGroup name="myattr">
        <xs:attribute ref="id"></xs:attribute>
        <xs:attribute ref="color"></xs:attribute>
    </xs:attributeGroup>
    <xs:element name="dog">
        <xs:complexType>
                <xs:group ref="mygroup"></xs:group>
                <xs:attributeGroup ref="myattr"></xs:attributeGroup>
        </xs:complexType>
        
    </xs:element>
</xs:schema>

xml

<?xml version="1.0" encoding="UTF-8"?>
<dog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\\Users\\xx\\Desktop\\schema\\my4.xsd" color="红色" id="id01">
    <name/>
    <health>10</health>
    <love>10</love>
    <strain/>
</dog>

 simpleType元素

 

 

 

综合例子1:schema文件

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="name" type="xs:string"></xs:element>
    
    <xs:element name="love" type="xs:int"></xs:element>
    <xs:element name="strain" type="xs:string"></xs:element>
    <xs:element name="sex" type="xs:string"></xs:element>
    <xs:element name="health" type="myhealth"></xs:element>
    <xs:element name="birthday" type="listOfDates"></xs:element>
    <!--应用在已有的数据类型上面,对已有的数据类型做限制-->
    <xs:simpleType name="myhealth">
        <xs:restriction base="xs:int">
            <xs:minInclusive value="60"></xs:minInclusive>
            <xs:maxInclusive value="100"></xs:maxInclusive>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType  name="listOfDates">
      <xs:list  itemType="xs:date"/>
    </xs:simpleType>

    
    <xs:group name="myGroupElement">
        <xs:sequence>
            <xs:element ref="name"></xs:element>
            <xs:element ref="health"></xs:element>
            <xs:element ref="love"></xs:element>
            <xs:element ref="sex"></xs:element>
            <xs:element ref="birthday"></xs:element>
        </xs:sequence>
    </xs:group>
    <xs:attributeGroup name="myattrGroup">
        <xs:attribute name="id" type="xs:string" use="required"></xs:attribute>
        <xs:attribute name="color" type="xs:string" use="optional"></xs:attribute>
        <xs:attribute name="strain" type="xs:string" use="prohibited"></xs:attribute>
    </xs:attributeGroup>
    <xs:element name="penguin">
        <!--匿名内部类-->
        <xs:complexType>
            <xs:group ref="myGroupElement"></xs:group>
            <xs:attributeGroup ref="myattrGroup"></xs:attributeGroup>
        </xs:complexType>
    </xs:element>
</xs:schema>

对应的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<penguin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd" id="p01" color="黑色">
    <name>旺财</name>
    <health>88</health>
    <love>100</love>
    <sex>黑狗</sex>
    <birthday>2010-01-01 2010-01-01 2010-01-01 2010-01-02</birthday>
</penguin>

综合例子2

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:attribute name="allframesize">
  <xs:simpleType>
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="roadbikesize"/>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="mountainbikesize"/>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
</xs:attribute>


<xs:simpleType name="roadbikesize">
  <xs:restriction base="xs:positiveInteger">
    <xs:enumeration value="16"/>
    <xs:enumeration value="20"/>
    <xs:enumeration value="28"/>
  </xs:restriction>
</xs:simpleType>


<xs:simpleType name="mountainbikesize">
  <xs:restriction base="xs:string">
    <xs:enumeration value="small"/>
    <xs:enumeration value="medium"/>
    <xs:enumeration value="large"/>
  </xs:restriction>
</xs:simpleType>


<xs:element name="myelement">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="name" type="xs:string"></xs:element>
        </xs:sequence>
        <xs:attribute ref="allframesize"></xs:attribute>
    </xs:complexType>
</xs:element>
</xs:schema>

对应的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<myelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema3.xsd" allframesize="small">
    <name/>
</myelement>

simpleContent元素

应用于complexType,对它的内容进行约束和扩展

好了,关于Schema我就讲这么多了,更多的Schema的用法,大家可以参考W3chool,对于Schema文档大家只要能看懂约束即可。

 

    

 

以上是关于XML-Schema验证的主要内容,如果未能解决你的问题,请参考以下文章

XML 模式/验证:数据类型双精度的不同分隔符

验证 Mongoose Schema 并显示自定义错误消息的最佳实践

Maven 中的 XML DTD/Schema 验证

根据 XML Schema (XSD) 验证 JSON

JSON解析器之json schema校验及代码实现

JSON 模式验证