XML学习笔记(二)---两种XML约束方式

前端之家收集整理的这篇文章主要介绍了XML学习笔记(二)---两种XML约束方式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

什么是XML约束?
在xml技术里,编写一个文档来约束一个xml文档,称为XML约束。

为什么要使用XML约束?
我们从网上下载了一个开源框架,这个开源框架是使用XML作为配置文件的,这时候框架的设计者就需要约束我们配置文件的写法。

XML约束的作用:
约束xml文档的写法
对xml进行校验

常见的XML约束技术:
XML DTD
XML Schema

DTD约束

引入DTD约束

外部引入

将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd。文件保存时必须用utf-8编码保存。

再在xml文件中使用

<!DOCTYPE 根元素名称  SYSTEM 文件的位置>

来引入这个DTD约束文件

SYSTEM表明引入的DTD在当前文件系统中,后面指定的文件位置是当前硬盘中的位置。

<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

PUBLIC表明引入的DTD在网络公共位置中,后面要指明DTD的名字和DTD所在网络位置URL地址

内部引入

直接在xml中书写DTD

<!DOCTYPE 根元素名称[
   dtd约束....
]>

DTD语法

元素

<!ELEMENT 元素名称 元素约束>

元素约束:
存放类型:ANY/EMPTY
元素约束:子元素的列表,将可以包含的子元素用小括号括起来
子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现
子元素之间可以使用竖线进行分割,表面子元素出现其中之一

#PCDATA 表明包含标签体

+ 表示一次或多次
* 0次或多次
? 0次或一次

也可以使用小括号进行组的操作

属性

<!ATTLIST 元素名 
            属性属性类型 属性约束
            属性名2 属性类型  属性约束
            ......
    >

属性类型:

  • CDATA:表示属性的值是一个普通字符串
  • ENUMERATED : 属性的值是一个枚举列表中的值
  • ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID属性的值只能由字母,下划线开始,不能使用数字开始,不能出现空白字符

属性约束:

#required

表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错

#IMPLIED

表明当前属性是一个可选的属性,可以有也可以没有

#FIXED "固定值"

表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值.如果这样的属性指定了一个不是固定值的值则校验报错

"默认值"

表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值

ENTITY(实体)

<!ENTITY >

就是对一大段内容的引用,可以简化代码的复用

引用实体:
在xml中引用的实体叫做引用实体

<!ENTITY 实体名称 “实体内容” >
&实体名称;

参数实体:
在dtd中引用的实体叫做参数实体

<!ENTITY % 实体名称 "实体内容">
%实体名称;

例子

对于下面这个DTD约束文件 book.dtd

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

根据这个约束可以写出如下的xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
    <>
        <书名>Thinking in Java</书名>
        <作者>Bruce Eckel</作者>
        <售价>79.00元</售价>
    </>
    <>
        <书名>第一行代码</书名>
        <作者>郭霖</作者>
        <售价>68.00元</售价>
    </>
</书架>

Schema约束

概述

  • Schema是xml的约束技术,出现的目的是为了替代dtd
  • 本身也是一个xml,非常方便使用xml的解析引擎进行解析
  • 名称空间有非常好的支持
  • 支持更多的数据类型,并且支持用户自定义数据类型
  • 可以进行语义级别的限定,限定能力大大强于dtd
  • 相对于dtd不支持实体
  • 相对于dtd复杂的多,学习成本比较的高

引入Schema约束

如何在xml中引入Schema—名称空间:
全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置。

  • 为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:
<zipstream:书架 xmlns:itcast="http://zipstream.me" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://zipstream.me book.xsd">
  • schemaLocation: 此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema
    的位置,两者之间用空格分隔。
  • 注意,在使用schemaLocation属性时,也需要指定该属性来自哪里。

Schema的语法

语法比较多也比较复杂,具体参照Schema的文档。

例子

对于下面这个DTD约束文件 shiporder.xsd

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="www.itheima.com" elementFormDefault="qualified" >
<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="orderperson" type="xs:string"/>
   <xs:element name="shipto">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="item" maxOccurs="unbounded">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
  <xs:attribute name="orderid" type="xs:string" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema>

根据这个约束可以写出如下的xml文件

<?xml version="1.0" encoding="utf-8" ?>
<itheima:shiporder xmlns:itheima="www.itheima.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.itheima.com shiporder.xsd" orderid="asdf" >
    <itheima:orderperson>asdf</itheima:orderperson>
    <itheima:shipto>
        <itheima:name>zzzz</itheima:name>
        <itheima:address>ssss</itheima:address>
        <itheima:city>sdfdf</itheima:city>
        <itheima:country>sdfdf</itheima:country>
    </itheima:shipto>
    <itheima:item>
        <itheima:title>sadfdsf</itheima:title>
        <itheima:note>sdfdsfdsf</itheima:note>
        <itheima:quantity>10</itheima:quantity>
        <itheima:price>100.99</itheima:price>
    </itheima:item>
    <itheima:item>
        <itheima:title>sadfdsf</itheima:title>
        <itheima:note>sdfdsfdsf</itheima:note>
        <itheima:quantity>10</itheima:quantity>
        <itheima:price>100.99</itheima:price>
    </itheima:item>
</itheima:shiporder>

猜你在找的XML相关文章