DTD约束与schema约束的不同

本篇笔记了解------Schema约束的语法

      ------可以参考W3school之Schema教程。

Schema:是基于 XML 的 DTD 替代者,用于描述XML文档结构。支持XML 命名空间-----xmlns--XML namespace的缩写

     XML Schema语言也称作XML Schema定义(XML Schema Definition,XSD)。

     因此,schema文件的扩展名为 .xsd,其本身也是个XML文件。

注意:XML Schema是W3c预先规定的一套xml元素和属性创建的,这些元素和属性定义了xml文档的结构和内容模式。

   在声明<Schema>文档时,必须以 XML 声明开头,其根节点是<Schema>。

    必须在根节点中声明几个属性:

xmlns:xsi="http://www.w3.org/2001/XMLSchema"--表示声明当前XML文件为一个约束文件,Schema中使用的元素和数据类型、属性来自该命名空间。

  targetNamespace属性 ------设置该约束文档的唯一标识,一般设置为URL路径---相当于身份证号,通过该属性值能引入约束文件。

     elementFormDefault属性:有两个值 qualified 和 unqualified,

        当值为qualified时----表示子元素必须使用命名空间前缀---别名         

        当值为unqualified时----表示子元素不必使用命名空间前缀---别名   

Schema文件声明:

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

   在XML实例文件中引入Schema约束文件:

      在XML文件根节点上定义一些属性:

一般把 -instance 修饰的命名空间声明为 xsi ------ xmlns : xsi ="http://www.w3.org/2001/XMLSchema-instance" --表示该xml为实例文件 

xmlns:命名空间的前缀 = "targetNamespace属性值"-----相当于引入约束文件,可以引入多个Schema文件。

  命名空间的前缀相当于包名,不同包的相同方法名(标签)自然不是同一个。 

       难理解: xsi:schemaLocation属性:用于声明了目标名称空间的模式文档

            xsi:noNamespaceSchemaLocation属性:用于没有目标名称空间的模式文档,属性值是单一值,只是用于指定模式文档的位置。

    schemaLocation属性值---------由一对URI组成。第一个URI是命名空间的名字,两个URI之间以空白符分隔,第二个URI给出模式文档.xsd的位置。模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配。XML Schema推荐标准中指出,xsi:schemaLocation属性可以在实例中的任何元素上使用,而不一定是根元素,不过,xsi:schemaLocation属性必须出现在它要验证的任何元素和属性之前,因此在schemaLocation中,所出现的命名空间,必须在之前用xmlns 声明过。    

xsi:noNamespaceSchemaLocation属性:用于引用没有目标名称空间的模式文档,其属性值是单一值----用于指定模式文档的位置。

      过程理解为:在实例文档中,我们可以多次用xmlns属性引入多个命名空间,但引入的命名空间必须在schemaLocation属性中声明引入的命名空间 和 命名空间来源的地址来有效,这个属性属于-INSTANCE修饰的实例文档的属性,而其中,我们用不同的命名空间前缀来区分命名空间的不同。而不同的命名空间都预先定义了标签和标签的属性、语法规则之类。比如:学生命名空间中设置了name标签,老师命名空间也设置了name标签,那么此时,当两个约束文档被引入到同一个XML实例文档时,如何区分?这个name标签到底要遵循学生命名空间还是老师命名空间呢?通过设置不同的前缀,在使用该标签时,用前缀设定。

      也可以反过来理解,只有当schemaLocation属性中的值生效时,之前的xmlns属性才生效。

            

XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns = "http://www.example.org/company"
xmlns:dept="http://www.example.org/department"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/company    company.xsd 
            http://www.example.org/department department.xsd
" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 定义一个命名空间-------------xmlns 命名空间的前缀相当于别名----xsi 命名空间URI----http://www.w3.org/2001/XMLSchema-instance XML文件中允许定义引用多个Schema约束文件,通过命名空间的前缀的不同来区分

 XML Schema作用:

     定义可出现在文档中的元素
     定义可出现在文档中的属性
     定义哪些元素是子元素
     定义子元素的次序
     定义子元素的数目
     定义元素和属性的数据类型
     定义元素和属性的默认值和固定值

    简单元素:仅包含文本,不包含任意其他的元素和属性 --<element name="xxx" type="数据类型" />---Schema有预先定义的数据类型。

    复杂元素: 包含子元素或属性的元素

<xs:element name="lastname" type="xs:string"/>   //name表示标签的名称---type表示标签值的数据类型
<xs:element name="age" type="xs:integer"/>     

XML Schema提供了4种分组结构来指示子元素的顺序:      

  <sequence>:表示有顺序,要求分组序列中的每个成员在实例文档中出现的顺序与定义的顺序相同。出现的次数由maxOccursminOccurs控制。

  <all>:使用all定义的元素组,在组中所有的元素成员都可以出现一次或者根本不出现,而且元素能够以任意顺序出现

  <choice>:choice分组相当于DTD中的"|",当子元素组合到choice中是,这些元素中只有一个元素必须在实例文档中出现,用于互斥的情况。

  <group>分组:group分组是将若干个元素声明归为一组,一以便将他们当做一个组并入复杂类型的定义。

<xsd:element name="电影" type="演员"/>
    <xsd:complexType name="演员">
        <xsd:sequence>
            <xsd:group ref="主演"/>
            <xsd:element name="片名" type="类型"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="类型">
        <xsd:choice>
            <xsd:element name="中文" type="string"/>
            <xsd:element name="英文" type="string"/>
        </xsd:choice>
    </xsd:complexType>
    <xsd:group name="主演">
        <xsd:sequence>
            <xsd:element name="男主演" type="string"/>
            <xsd:element name="女主演" type="string"/>
        </xsd:sequence>
    </xsd:group>
</xsd:schema

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

  <xs:attribute name="xxx" type="yyy"/>
  <!--name指属性名,type指属性数据类型-->

  在XML  Schema文件中,内置(预先定义)多种数据类型和标签、属性-----------这些可以对内容进行限定,而内容指-----元素(标签)、属性的内容进行限定,如:必须为某类型的值之类。

     在XML Schema文件中,可以对复杂和简单元素都进行设置限定,而都预先设置好了标签用来限值。

   下面是对复杂类型进行限值------其中包括子元素和属性进行限值

       简单元素是没有子元素和属性的-----只对它标签内容进行限值。

 <xsd:element name="电影">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="片名" type="xsd:string"/>
                <xsd:element name="主演" type="主演类型"/>
                <xsd:element name="发行情况">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="编号" type="xsd:integer"/>
                            <xsd:element name="发行时间" type="xsd:string"/>
                            <xsd:element name="发行国家" type="xsd:string"/>
                            <xsd:element name="拷贝数量" type="数量类型"/>
                        </xsd:sequence>
                    <xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="主演类型">
        <xsd:restriction base="xsd:string">
            <xsd:minLength value="6"/>
            <xsd:maxLength value="20"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="数量类型">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="1"/>
            <xsd:maxInclusive value="10000"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

     

XML  Schema中数据类型:

​       内置的数据类型(built-in data types)

​       基本的数据类型(Primitive Data Types)

​       扩展的数据类型(Deriverd Data Types)

​       用户自定义数据类型(通过simpleType定义)

      复杂类型(通过complexType定义)

  

XML  Schema约束与DTD约束相比较:

    DTD约束只能引用一个,而Schema约束可以引用多个

    DTD的数据类型是有限的,而Schema有多种数据类型,包括自定义数据类型

    DTD和xml用的是自己特殊的语法,而schema遵循xml语法

    DTD不可以扩展,并且不支持命令空间

    DOM和SAX的解析方式更容易解析schema

     参考笔记:博主「江湖小妞」-------https://blog.csdn.net/u010161630/article/details/52829371

猜你喜欢

转载自www.cnblogs.com/Tanggula-pioneer/p/11772084.html