关于XML和Schema约束的一些总结。

在学习XML约束的时候DTD约束还比较易懂(也可能是错觉),但是Schema约束的命名空间、引入,Schemalocation等比较难懂,总结一下最近自己查看其他专家的博客琢磨出来的东西

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" //这里可能有错误,该xsd文件多定义了一行默认的xmlSchema
    targetNamespace="http://www.example.org/web-app_2_5"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:tns="http://www.example.org/web-app_2_5"
    elementFormDefault="qualified">

    <xsd:element name="web-app">
        <xsd:complexType>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="servlet">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="servlet-name"></xsd:element>
                            <xsd:element name="servlet-class"></xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="servlet-mapping">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="servlet-name"></xsd:element>
                            <xsd:element name="url-pattern" maxOccurs="unbounded"></xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="welcome-file-list">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="welcome-file" maxOccurs="unbounded"></xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:choice>
            <xsd:attribute name="version" type="double" use="optional"></xsd:attribute>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

这是一个XSD约束文件,其中

xmlns与xmlns:nsd、xmlns:tns称为对命名空间的引用,xmlns称为默认命名空间,xmlns:前缀 称为显式命名空间,这两个有什么区别?

如果使用的是xmlns中定义的元素、属性、类型等成员直接使用即可,例如:<servlet>

如果使用的是xmlns:前缀中定义的元素、属性、类型等成员则需要在前面加上前缀,例如:<xsd:element>

“http://www.w3.org/2001/XMLSchema”是每个xsd文件必须有的命名空间,定义了element, attribute, complexType, group, simpleType等元素。

targetNamespace属性对本xsd文件所在的命名空间进行了定义,就好像java文件头上的“package cn.haiyisoft.xml”这个一样,说明了我这个java文档是在这个包下一样

xmlns与targetNamespace的关系,targetNamespace是定义了命名空间,而xmlns是将这个命名空间进行引入;xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找。这就是xsd约束文件的一个很奇怪的地方,就算我某个成员定义在我文件内部,你想直接用也不行,必须用xmlns将我这个命名空间引入,如下例子:

xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找。修改一下note.xsd,去除默认名称空间的声明,并添加一个复杂类型:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
        <xsd:sequence>
       <xsd:element name="to" type="xs:string"/>
       <xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
       <xsd:element name="body" type="xs:string"/>
       </xsd:sequence>
      </xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="stu"/>
  <xsd:complexType name="stu">
  <xsd:sequence>
   <xsd:element name="Name" type="xs:string"/>
   <xsd:element name="Class" type="xs:string"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:schema>

上述代码中,复杂类型stu是找不到的,因为你定义了一个名称空间"http://www.w3schools.com",该复杂类型存在于"http://www.w3schools.com"中,因此应该修改代码如下:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns:student="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
        <xsd:sequence>
       <xsd:element name="to" type="xs:string"/>
       <xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
       <xsd:element name="body" type="xs:string"/>
       </xsd:sequence>
      </xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="student:stu"/>
  <xsd:complexType name="stu">
  <xsd:sequence>
   <xsd:element name="Name" type="xs:string"/>
   <xsd:element name="Class" type="xs:string"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:schema>

若自身并不使用重用定义的成员,仅供外部使用的话,则只定义targetNameSpace就可以,不用特别把自己的命名空间再次引入。

为什么xsd也有xmlns等属性呢?因为xsd也是一个xml文档啊,只不过后缀名变成了.xsd

关于elementFormDefault 有qualified和unqualified使用来规定是否只有全局成分才被定义在目标名称空间中。

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/book"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/book book.xsd">
    <book id="1001">
        <name>Thinking in Java</name>
        <author>Bruce Eckel</author>
        <price>86.4</price>
    </book>
    <book id="1002">
        <name>Head First 设计模式</name>
        <author>Freeman</author>
        <price>64.2</price>
    </book>
    <book id="1003">
        <name>深入理解Java虚拟机</name>
        <author>周志明 </author>
        <price>59.2</price>
    </book>
</books>

以上是一个xml文件

其中“http://www.w3.org/2001/XMLSchema-instance”是必须有的,它定义了一些成员,其中schemaLocation就是它其中定义的一个属性,所以根元素中的schemaLocation需要加xsi前缀

schemaLocation是一个类似于键值对的形式,由路径和文件名组成,以给解析器说明约束文件所在的位置,其中的路径必须和摸个xmlns引入的命名空间相同,也与此约束文件的targetNamespace的值相同

本文的参考来自于

1.https://blog.csdn.net/qq_38724991/article/details/76131614

2.https://blog.csdn.net/wanghuan203/article/details/9203621

3.https://blog.csdn.net/wanghuan203/article/details/9204337

4.https://blog.csdn.net/freelk/article/details/80869439#commentBox

5.https://blog.csdn.net/pzasdq/article/details/52592819

6.https://blog.csdn.net/ruizhe_hao/article/details/53432558

7.https://www.cnblogs.com/TIMHY/p/7780642.html

8.https://www.cnblogs.com/ihanliu/p/4718795.html

原文地址:https://www.cnblogs.com/JSD1207ZX/p/10162438.html

时间: 2024-10-15 13:34:02

关于XML和Schema约束的一些总结。的相关文章

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

XML技术-Schema约束-Dom4j-Xpath详解

这辈子没办法做太多事情所以每一件都要做到精彩绝伦 People can't do too many things in my life,so everything will be wonderful   乔布斯 本文档参考资料w3cschool.CHM  API教程文档免费下载地址http://down.51cto.com/data/2300287 XML技术 1.     什么是XML XML 指可扩展标记语言EXtensibleMarkup Language XML 是一种标记语言很类似 H

xml的schema约束(Java)

1.schema约束 *dtd语法:<!ELEMENT 元素名称 约束> schema符合xml的语法,是xml语句. 一个xml文件中可以有多个schema,多个schema使用名称空间来区分(类似于java中的包),而一个xml文件中只能有提个dtd. dtd中有PCDATA类型,而在schema中支持多种数据类型,比如,年龄只能是一个整数,在schema中可以直接定义一个整数类型. schema语法更加复杂,目前不能代替dtd. person.xml <?xml version=&

XML的Schema约束

XSD文档至少要包含:schema根元素和XML模式命名空间的定义.元素定义.需要注意的是XSD中必须定义一个且只能定义一个schema根元素,根元素中包括模式的约束,XML模式命名空间的定义,其他命名空间的定义.版本信息.语言信息和其他一些信息. 1.schema根元素定义: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ... </xsd:schema>  2.普通元素定义: <xs

关于Spring配置文件xml文档的schema约束

最开始使用spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. [html] view plain copy print? <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:m

Spring中xml文档的schema约束

最开始使用Spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springfram

XML的DTD和Schema约束

为什么要使用约束? XML是自定义的标签,有时候标签太多,记不住,所以就需要有约束来告诉我能写哪些标签,哪些标签写错了不能识别 XML中有哪几种约束? 有很多约束,其中DTD和Schema约束最为常见. 约束本质上是什么? 约束本质上也是一种xml文件. DTD约束和Schema约束的区别 特点的区别: DTD约束较为古老,简单,一些老框架使用DTD作为约束:Struts2和Hibernate都使用DTD作为其XML配置文件的约束 Schema约束功能更为强大,用的更为广泛,Tomcat和Spr

xml初步,DTD和Schema约束

XML 可扩展的标记语言(!!!可扩展) 作用 1.存放数据 2.配置文件 语法 文档声明 <?xml version="1.0" encoding="UTF-8"?> 1.文档声明必须为<?xml开头,以?>结束: 2.文档声明必须从文档的0行0列位置开始: 3.文档声明只有2个属性: version 版本 encoding 编码 元素 <bean></bean> 1.必须开始结束 2.标签由开始标签,元素体,结束标

XML Schema约束

schema规范中:    1. namespace : schema文件的标识属性,相当于id,每个schema文件需要有一个唯一的namespace值:    2. targetNameSpace :指定当前schema文件的namespace值,它的值是一个url(很有可能不存在):    3. xmlns :引入一个schema约束,它的值为一个schema的namespace值            属性? : 用xmlns属性            属性值: 对应的schema文件的