XML-约束(schema)

   我们已经知道了只有有约束的XML文件才能算是一个有效的文件,说到约束除了dtd约束还可以有其他的方法吗?

   接下来就是我要介绍的新的约束——schema约束:

   XMLSchema 也是一种用于定义和描述 XML文档结构与内容的模式语言,其出现是为了克服 DTD的局限性

   XMLSchema VS DTD

   XMLSchema符合XML语法结构。

   DOMSAXXML API很容易解析出XML Schema文档中的内容。

   XMLSchema名称空间支持得非常好。

   XMLSchemaXML DTD支持更多的数据类型,并支持用户自定义新的数据类型。

   XMLSchema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。

   XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD

   那么什么是schema呢?

  XMLSchema 文件自身就是一个 XML 文件,但它的扩展名通常为 . xsd
  一个 XMLSchema 文档通常称之为 模式文档 ( 约束文档 ) ,遵循这个文档书写的 xml 文件称之为 实例文档
  XML 文件一样,一个 XMLSchema 文档也必须有一个根结点,但这个根结点的名称为 Schema
  编写了一个 XMLSchema 约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在 XMLSchema 技术中有一个专业术语来描述这个过程,即把 XMLSchema 文档声明的元素绑定到一个 名称空间 上,以后 XML 文件就可以通过这个 URI (即名称空间)来告诉解析引擎, xml 文档中编写的元素来自哪里,被谁约束。
  接下来,大家可以通过一个案例来看看schema的使用方法:

 

 

 

接下来让我们来看看schema语法的具体说明:

       名称空间的概念:

       在 XMLSchema 中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的 URI UniformResource Identifier ,统一资源标识符)表示。在 Xml 文件中书写标签时,可以通过名称空间声明( xmlns ),来声明当前编写的标签来自哪个 Schema 约束文档。如:

  <csdn:书架xmlns:csdn=“http://www.csdn.net”>

  <csdn:>……</csdn:>

  </csdn:书架>

   此处使用csdn来指向声明的名称,以便于后面对名称空间的引用。

       注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL http://www.csdn.net 根本没有指向任何文件,只是一个分配的名字。
      使用名称空间引入Schema:
       为了在一个 XML 文档中声明它所遵循的 Schema 文件的具体位置,通常需要在 Xml 文档中的根结点中使用 schemaLocation 属性来指定,例如:

            <csdn:书架xmlns:csdn="http://www.csdn.net"

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

           xsi:schemaLocation=“http://www.csdn.netbook.xsd">

       schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的XML schema 的位置,两者之间用空格分隔。

       注意,在使用 schemaLocation 属性时,也需要指定该属性来自哪里。
     使用默认名称空间:

 

 

 

那么究竟schema的语法又是什么呢?

xsd约束文件:

<?xml version="1.0" encoding="UTF-8"?>
<game:schema xmlns:game="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.example.org/asd"  
xmlns="http://www.example.org/asd"  
elementFormDefault="qualified">
<!-- 需要引用w3c的命名空间,并指定一个命名空间,将所有的约束绑定到指定的命名空间当中 -->
<!-- 
schema语法练习:
1.XSD简易属性
2.XSD属性
3.限定值
4.通过枚举限定值
5.根据正则表达式来限定值
6.定义以及使用复合类型
7.XSD仅含文本复合元素
 -->
 
<!-- 6.定义复合类型 -->
<game:complexType name="game_Name"><!-- 6.使用复合类型 -->
  <game:all>
    <game:element name="刀塔" type="game:string"/>
    <game:element name="英雄联盟" type="game:string"/>
    <game:element name="反恐精英" type="game:string"/>
  </game:all>
</game:complexType>
 
<game:element name="电子竞技">
<game:complexType>
  <game:sequence>
  <game:element name="names" type="game_Name" /><!-- 6.引用复合类型 -->
  <game:element name="DOTA2" type="game:string" default="MOBA"/><!-- 1.设置默认值 -->
  <game:element name="DNF" type="game:string" fixed="ACT"/><!-- 1.设置固定值 -->
  
  <game:element name="CS">
  <game:complexType>
  <game:attribute name="name" type="game:string" use="required"/><!-- 2.设置属性(属性需要设置在复合类型之中) -->  
  </game:complexType>
  </game:element>
  
  
  <game:element name="return"><!-- 3.限定值 -->
    <game:simpleType>
     <game:restriction base="game:integer">
     <game:minExclusive value="10"/>
     <game:maxExclusive value="100"/>
     </game:restriction>
    </game:simpleType>
  </game:element>
  
  <game:element name="sex"><!-- 4.通过枚举限定值 -->
    <game:simpleType>
      <game:restriction base="game:string">
        <game:enumeration value="M"/>
        <game:enumeration value="F"/>
      </game:restriction>
    </game:simpleType>
  </game:element>
  
  <game:element name="word"><!-- 5.根据正则表达式限定值 -->
    <game:simpleType>
      <game:restriction base="game:string">
        <game:pattern value="[a-z]"/>
      </game:restriction>
    </game:simpleType>
  </game:element>
  
  <game:element name="habit"><!-- 7.XSD仅含文本复合元素  -->
    <game:complexType>
      <game:simpleContent>
         <game:extension base="game:string">
           <game:attribute name="country" type="game:string"/>
         </game:extension>
      </game:simpleContent>
    </game:complexType>
  </game:element>
  
  </game:sequence>
</game:complexType>
</game:element>



</game:schema>


xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<xx:电子竞技  xmlns:xx="http://www.example.org/asd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/asd asd.xsd">

<xx:names>
  <xx:刀塔></xx:刀塔>
  <xx:英雄联盟></xx:英雄联盟>
  <xx:反恐精英></xx:反恐精英>
</xx:names>
<xx:DOTA2>MOBA</xx:DOTA2><!-- 设置默认值为MOBA -->
<xx:DNF>ACT</xx:DNF><!-- 设置固定值为ACT(缺省也为ACT) -->
<xx:CS name="electric"></xx:CS>
<xx:return>11</xx:return>
<xx:sex>M</xx:sex>
<xx:word>a</xx:word>
<xx:habit>DOTA2</xx:habit>
</xx:电子竞技>


其他(补充,any和anyattribute):

xsd文件:

cl.xsd

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

<xs:element name="children">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="childname" type="xs:string"
      maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:attribute name="name">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="Retror|Cold"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>


</xs:schema>

 

persons.xsd

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

<xs:element name="persons">
</xs:element>

</xs:schema>


 

xn.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.example.org/xn" 
 xmlns="http://www.example.org/xn" 
 elementFormDefault="qualified">
 
<xs:element name="sex" type="xs:string"/>
<xs:element name="gender" substitutionGroup="sex"/><!-- 元素替换的操作 -->
 
 <xs:element name="person">
   <xs:complexType>
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
        <xs:element ref="sex"/><!-- 引用 需要在扩展之前--> 
        <xs:any minOccurs="0"/><!-- 扩展元素 -->
      </xs:sequence>
      <xs:anyAttribute/><!-- 扩展属性 -->
   </xs:complexType>
 </xs:element>
</xs:schema>


xn.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://person.cn/p" 
	xmlns:p="http://www.example.org/xn"
	xmlns:c="http://www.w3cschool.cn"
	xsi:schemaLocation="http://www.example.org/xn xn.xsd http://www.w3cschool.cn cl.xsd http://person.cn/p persons.xsd">

	<p:person c:name="Retror">
	  <p:firstname></p:firstname>
	  <p:lastname></p:lastname>
	  <p:gender></p:gender>
	  <c:children>
	    <c:childname>xxx</c:childname>
	  </c:children>
	</p:person>
</persons>


希望能帮到大家!

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值