其他分享
首页 > 其他分享> > XSD学习记录

XSD学习记录

作者:互联网

XSD学习记录

主要来自菜鸟教程的学习笔记,结合其他博客作了一些综合的学习,对最基本的内容整理了本markdown格式的单文档。

概念

  1. 全称
    XML Schema Definition,作用是定义 XML 文档的合法构建模块,类似DTD.
  2. 示例
    请看这个名为 “note.xml” 的 XML 文档:
    <?xml version="1.0"?>
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>
    
    下面这个例子是一个名为 “note.xsd” 的 XML Schema 文件,它定义了上面那个 XML 文档( “note.xml” )的元素:
       <?xml version="1.0"?>
       <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://www.w3schools.com"
       xmlns="http://www.w3schools.com"
       elementFormDefault="qualified">
       <xs:element name="note">
       <xs:complexType>
           <xs:sequence>
           <xs:element name="to" type="xs:string"/>
           <xs:element name="from" type="xs:string"/>
           <xs:element name="heading" type="xs:string"/>
           <xs:element name="body" type="xs:string"/>
           </xs:sequence>
       </xs:complexType>
       </xs:element>
       </xs:schema>     
    

在 XML 文档中引用 Schema

以下的这个XML文档(为maven项目的pom文件)含有对XML Schema的引用

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
……
</project>

下面的代码片断:

xmlns="http://maven.apache.org/POM/4.0.0"

规定了默认命名空间的声明。此声明会告知schema验证器,在此XML文档中使用的所有元素都被声明于"http://maven.apache.org/POM/4.0.0"这个命名空间。

现在来看文件头中剩下的,看上去更为复杂的部分:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"

  根据之前的知识我们可以理解,xmlns:xsi定义了一个命名空间前缀xsi,对应的唯一字符串http://www.w3.org/2001/XMLSchema-instance。但是读者会发现,这个xmlns:xsi在不同的xml文档中似乎都会出现。这是因为,xsi 已经成为了一个业界默认的用于 XSD((XML Schema Definition) 文件的命名空间。
那么, 有了上述的理解, 再来看

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"

上面这行的语法其实是, xsi:schemaLocation = "键" “值”
即xsi命名空间下schemaLocation元素的值为一个由空格分开的键值对

XSD <schema>元素 (根元素)

<schema> 元素是每一个 XML Schema 的根元素。

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

以下代码片段:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema”。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:

这个片段:

targetNamespace="http://www.runoob.com"  

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: “http://www.runoob.com”。

这个片断:

xmlns="http://www.runoob.com"

指出默认的命名空间是 “http://www.runoob.com”。

这个片断:

elementFormDefault="qualified"

指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

XSD 简易元素

XSD 属性(attribute)

所有的属性均作为简易类型来声明。

简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

XSD 限定(Facets)

限定(restriction)用于为XML元素或者属性定义可接受的值。对XML元素的限定被称为facet。

其它限制模式还有很多,不在深入研究

XSD 复合元素

复合元素包含了其他的元素及/或属性。

如何定义复合元素

请看这个复合 XML 元素,“employee”,仅包含其他元素:

<employee>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</employee>

在 XML Schema 中,我们有两种方式来定义复合元素:

  1. 通过命名此元素,可直接对"employee"元素进行声明,就像这样:

    <xs:element name="employee">
    <xs:complexType>
        <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    </xs:element>
    

    假如您使用上面所描述的方法,那么仅有 “employee” 可使用所规定的复合类型。请注意其子元素,“firstname” 以及 “lastname”,被包围在指示器 <sequence>中。这意味着子元素必须以它们被声明的次序出现。您会在XSD 指示器这一节学习更多有关指示器的知识。

  2. “employee” 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称:

    <xs:element name="employee" type="personinfo"/>
    <xs:complexType name="personinfo">
    <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    

    如果您使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型,比如这样:

    <xs:element name="employee" type="personinfo"/>
    <xs:element name="student" type="personinfo"/>
    <xs:element name="member" type="personinfo"/>
    <xs:complexType name="personinfo">
    <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    

    您也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样:

    <xs:element name="employee" type="fullpersoninfo"/>
    <xs:complexType name="personinfo">
    <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="fullpersoninfo">
    <xs:complexContent>
        <xs:extension base="personinfo">
        <xs:sequence>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
        </xs:sequence>
        </xs:extension>
    </xs:complexContent>
    </xs:complexType>
    

XSD 指示器

通过指示器,我们可以控制在文档中使用元素的方式。

Order指示器

Order 指示器用于定义元素的顺序。

Occurrence指示器

Occurrence 指示器用于定义某个元素出现的频率。
注意:
对于所有的 “Order” 和 “Group” 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。

Group 指示器

Group指示器用于定义相关的数批元素。
 个人理解: 数批元素表示元素/

标签:XML,http,定义,指示器,记录,元素,学习,XSD,属性
来源: https://blog.csdn.net/weixin_39716710/article/details/117090770