ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XML Schema详细教程(一)如何使用

2020-01-29 14:08:36  阅读:314  来源: 互联网

标签:XML 教程 元素 文档 空间 Schema schema


什么是 XML Schema?

Schema,即XML Schema,XSD (XML Schema Definition)是W3C于2001年5月发布的推荐标准,指出如何形式描述XML文档的元素。XSD是许多XML Schema 语言中的一支。XSD是首先分离于XML本身的schema语言,故获取W3C的推荐地位。

XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
注意:XSD只是Schema众多规范中的一种,还有XDR、DCD、SOX、DDML。

XML Scheman功能:

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的次序
  • 定义子元素的数目
  • 定义元素是否为空,或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值

如何使用

本章主要讲解的是如何定义schema文件,以及如何在xml文件中引入schema约束

1.没有命名空间的情况

下面这个例子是名为 “books.xsd” 的schema文件

<?xml version='1.0' encoding='UTF-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="books">
        <xsd:complexType>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="book" >
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="name" type="xsd:string"></xsd:element>
                            <xsd:element name="price" type="xsd:decimal"></xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

代码解释

xmlns:xsd=“http://www.w3.org/2001/XMLSchema”

  显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema”。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xsd,当然这个前缀可以自定义,xsd就是代表XML Schema Definition,所以很多框架会使用这个前缀。

  另外对于任何一个XML Schema架构文档(XSD)都有一个最顶层的schema 元素。而且该schema元素定义必须包含这个名称空间:http://www.w3.org/2001/XMLSchema。即此名称空间是由XML模式规范定义的标准名称空间-所有XML模式元素必须属于该名称空间。

  这边还想给大家强调一点就是,xmlns这个属性是XML中的属性(XML Schemal本身就是基于XML编写),主要为了避免命名冲突的(了解xmlns,点击这里),不具有导入功能。如果在xsd中需要导入其他的xsd,需要使用标签<xsd:import namespace=“xxx” schemaLocation=“xxx.xsd”/>,后面会讲,而想在xml使用schema约束,也需要通过xsi:noNamespaceSchemaLocation或者 xsi:schemaLocation属性指出模式文档的位置,导入后可以通过xmlns指定前缀或者默认名称空间来使用。

  要注意的是,XML Schema推荐标准并没有要求模式处理器必须要使用xsi:schemaLocation属性,某些模式处理器可以通过其他的方式来得到模式文档的位置,而忽略xsi:schemaLocation属性。如果引入的schema是w3c定义的,一般是不需指定schema文件位置。


下面的xml文件会引入上面"books.xsd" 的schema约束:

<?xml version="1.0" encoding="UTF-8" ?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="books.xsd">
    <book>
        <name>java编程思想</name>
        <price>11.22</price>
    </book>
    <book>
        <name>head first设计模式</name>
        <price>22.44</price>
    </book>
</books>

代码解释

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

  xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” 是任何XML实例文档固有的XML模式实例名称空间,它由XML模式规范定义。
  xml文件要引入schemal校验,必须使用"http://www.w3.org/2001/XMLSchema-instance"名称空间的schemaLocation或者noNamespaceSchemaLocation属性指出模式文档的位置,前者用于声明了目标名称空间的模式文档,后者用于没有目标名称空间的模式文档

xsi:noNamespaceSchemaLocation=“books2.xsd”

  用于引入没有目标名称空间的模式文档,属性的值是单一的值,只是用于指定模式文档的位置,模式处理器将从这个位置读取模式文档


2.有命名空间的情况

还是books.xsd文件,此时申明了该schema文件的名称空间:

<?xml version='1.0' encoding='UTF-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="yth" elementFormDefault="qualified">
    <xsd:element name="books">
        <xsd:complexType>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="book" >
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="name" type="xsd:string"></xsd:element>
                            <xsd:element name="price" type="xsd:decimal"></xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

targetNamespace、elementFormDefault属性是为了申明该schema文件所定义的元素和数据类型所属于的命名空间。
代码解释

targetNamespace=“yth”

  这个targetNamespace属性就是申明了该schema所对应的名称空间的URI。引用该Schema的其它文档(包括自身文档),需要xmlns引入该名称空间才能使用,其URI就是targetNamespace的属性值。
注意:如果引入的schema不是w3c定义的,还必须指定schema文件位置

elementFormDefault=“qualified”

  这一属性用来指示 XML Schema 处理程序把这个 XML schema 中定义的元素或者类型放到哪个命名空间。有人觉得很奇怪,不是应该都属于targetNamespace申明的空间吗?
  其实这样的,一个schema中声明的元素或者类型可以归到两个命名空间中的某一个去,这两个是,无名命名空间和由targetSchema属性指明的目标命名空间。

  • 当elementFormDefault=“qualified” 时,全局元素或者类型将归于目标命名空间,局部元素将以缺省方式也归于目标命名空间。
  • 而当elementFormDefault=“unqualified” 时,全局元素或者类型将归于目标命名空间,局部元素将归于无名命名空间。

PS:全局元素指 “schema” 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。

举例:
如果将上面的elementFormDefault="qualified"改成unqualified,或者删除,那么对应的xml需要这样引用:

<?xml version="1.0" encoding="UTF-8" ?>
<yth:books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="yth books.xsd" xmlns:yth="yth">
    <!-- xmlns:yth yth命名空间需要定义前缀,不能用默认名称空间
    	因为一旦用默认名称空间,无命名空间的元素将没有方式引用 -->
    <book>
        <name></name>
        <price>22.2</price>
    </book>
     <!-- 看到除了全局元素books在yth命名空间里,book、name、price等元
    素归于无命名空间,不需要前缀引用 -->
</yth:books>

对应的xml文件引用的就是上面有名称空间的schema:

<?xml version="1.0" encoding="UTF-8" ?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="yth books.xsd" xmlns="yth">
    <book>
        <name>java编程思想</name>
        <price>11.22</price>
    </book>
    <book>
        <name>head first设计模式</name>
        <price>22.44</price>
    </book>
</books>

代码解释

xsi:schemaLocation=“yth books.xsd”

  schemaLoation属性是"http://www.w3.org/2001/XMLSchema-instance"名称空间的一个属性,用于指出声明了目标名称空间的模式文档的位置
  xsi:schemaLocation属性的值由一个URI引用对组成,两个URI之间以空白符分隔。第一个URI是名称空间的名字,第二个URI给出模式文档的位置,模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配。
  xsi:schemaLocation属性的值也可以由多个URI引用对组成,每个URI引用对之间使用空白符分隔。

xmlns=“yth”

  申明默认名称空间,不需要使用前缀,默认使用的标签就是yth名称空间的元素。
PS:看情况使用,因为一旦申明了默认名称空间,那么无名名称空间的元素将使用不了。


3.XML Schema导入

  通常一个很小的xml文档不需要复杂的命名空间来限定作用域。但是当文档复杂性越来越大,全的命名空间规则很复杂,如果要通过XML Schema来创建和修改XML的内容限定的话,很多人会习惯性的在一个文件中储存所有的Schema。但是实际上一个良好的符合标准的规范应当是将文档分成很多个子Schema,这个过程可以叫做XML Schema Binding。命名空间就是一个分割Schema的机制,子schema被包含在一个父schema中,这样就提高了复用性,使得一个schema包可以用在很多的工程中。而且这样能够提高定义的可读性,也使文档易于管理。

<xsd:import namespace=“xxx” schemaLocation=“xxx.xsd”/>

  使用该语法可以在schemal中导入其他schema。导入以后,通过xmlns申明后使用。

举例:

定义author.xsd文件,代表书的作者:

<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="author" elementFormDefault="qualified">
    <xsd:element name="author">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="name" type="xsd:string"/>
                <xsd:element name="age" type="xsd:integer"/>
                <xsd:element name="gender" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

申明了空间名author,再看原来的books.xml:

<?xml version='1.0' encoding='UTF-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="yth" xmlns:a="author"
            elementFormDefault="qualified">
    <!-- 1.导入author名称空间,指定该空间模式文档的位置 -->
    <!-- 2.在schema根标签中申明名称空间ahthor指定别名a -->
    <xsd:import
            namespace="author"
            schemaLocation="author.xsd"/>

    <xsd:element name="books">
        <xsd:complexType>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="book">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="name" type="xsd:string"></xsd:element>
                            <xsd:element name="price" type="xsd:decimal"></xsd:element>
                            <xsd:element ref="a:author"/>
                            <!-- 3. 使用author空间的author元素 -->
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

对应xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<yth:books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="yth books.xsd" xmlns:yth="yth" xmlns:a="author">
    <yth:book>
        <yth:name></yth:name>
        <yth:price>22.2</yth:price>
        <a:author>
            <a:name></a:name>
            <a:age>11</a:age>
            <a:gender></a:gender>
        </a:author>
    </yth:book>
</yth:books>
fixBug1995 发布了2 篇原创文章 · 获赞 0 · 访问量 35 私信 关注

标签:XML,教程,元素,文档,空间,Schema,schema
来源: https://blog.csdn.net/weixin_41947378/article/details/104105408

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有