首页 > 代码库 > 第1天 XML和DTD、schema约束

第1天 XML和DTD、schema约束

1、xml

* 扩展名:*.xml

* 作用:存储、配置

一个XML文件分为如下几部分内容:文档声明、元素、属性、注释  CDATA区、特殊字符、处理指令(processing instruction)。

1.1文档声明

最简单的声明语法:

<?xml version="1.0" ?>

version:设置当前xml文档内容使用的版本

用encoding属性说明文档的字符编码:

         <?xml version="1.0" encoding="GB2312" ?> 

用standalone属性说明文档是否独立:

         <?xml version="1.0" encoding="GB2312"  standalone="yes" ?>

常见错误

没有写引号:<?xml version=1.0 ?>

输入内容中有中文: <?xml version=“1.0” ?>  //中文空格

编码错误,记事本设置编码UTF-8,用其他编辑器打开。

1.2元素

XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签。

格式:<x></x> or <x />,名称自定义

  • 建议字母开头
  • 区分大小写
  • 不能包含空格 <a b>
  • 不能包含冒号 <a:b>

注意:

  •  一个标签中也可以嵌套若干子标签,但不能交叉嵌套
  •  格式良好的xml文档只有一个根

  由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。

1.3属性

  • 前提:在某元素的基础上,确定相应的属性
  • 格式:<x attribute="attrValue"  />.

一个标签可以有多个属性,每个属性都有它自己的名称和取值。

属性值一定要用双引号(")或单引号(‘)引起来。

定义属性必须遵循与标签相同的命名规范。

1.4注释

格式:<!--注释内容-->

注意:XML声明之前不能有注释;注释不能嵌套

1.5转义字符

         格式: &xx;  --> &#123;详见“html转义.html”

HTML特殊转义字符列表

最常用的字符实体

Character Entities

显示

说明

实体名称

实体编号

 

半方大的空白

&ensp;

&#8194;

 

全方大的空白

&emsp;

&#8195;

 

不断行的空白格

&nbsp;

&#160;

小于

&lt;

&#60;

大于

&gt;

&#62;

&

&符号

&amp;

&#38;

"

双引号

&quot;

&#34;

?

版权

&copy;

&#169;

?

已注册商标

&reg;

&#174;

?

商标(美国)

?

&#8482;

×

乘号

&times;

&#215;

÷

除号

&divide;

&#247;

1.6 CDATA区

  在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。

  • 在xml文档中存放任意内容的区域
  • 格式:<![CDATA[  cdata内>*容  ]]>

1.7处理指令(processing instruction,PI)

  处理指令用来指挥解析引擎如何解析XML文档内容。例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。

         格式:<?xml-stylesheet type="text/css" href="http://www.mamicode.com/uri"  ?>

  • type:类型,内容是MIME类型 image/jpeg
  • href:确定引用文件的位置。
  •     uri:统一资源标识符,1.html  news/m.html
  •     url:统一资源定位符,http://www.fengjie.com/news/m.html

处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。

1.8 xml乱码

         * 文档内容编码:UTF-8

         * 文件编码:window默认GBK

         * 解决文件乱码的方法:将文档内容编码与文件编码统一。

XML语法规则总结:

  •  所有 XML 元素都须有关闭标签
  • XML 标签对大小写敏感
  • XML 必须正确地嵌套顺序
  • XML 文档必须有根元素
  • XML 的属性值须加引号
  • 特殊字符必须转义
  • XML 中的空格会被保留

2、编码、字符集

         UTF-8:万国码,(1-6字符)

         GB2312:国标码(简体)

         GBK:国标码(简体、繁体),GB2312升级版

         GB18030:国标码(简体、繁体、少数名族),GBK升级版

         BIG5:大5码(繁体)

         ISO-8859-1:英文编码

3、约束

         在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。

         常用的约束技术有两种:XML DTD和XML schema

3.1 DTD约束

  DTD(Document Type Definition),全称为文档类型定义。DTD约束既可以作为一个单独的文件编写,也可以在XML文件内编写。XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件。

(1)文档关联方式

  •  内部关联格式:<!DOCTYPE 根元素 [语法]>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
<!ELEMENT books (book+)>
<!ELEMENT book (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<books>
<book>
    <name>Java</name>
    <author>LXH</author>
    <price>3212</price>
</book>
</books>
  • 外部关联格式:<!DOCTYPE 根元素 SYSTEM "URI">

book.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT books (book+)>
<!ELEMENT book (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "book.dtd">
<books>
<book>
    <name>Java</name>
    <author>LXH</author>
    <price>44</price>
</book>
</books>
  • 公共关联格式:<!DOCTYPE 根元素 PUBLIC "文档名称" "文档URL">

新建一个Web Project,J2EE Specification Level选择“J2EE1.3”,如图所示。

技术分享

在新建的Web Project下有一个WebRoot文件夹,下面有个WEB-INFO,里面还有个web.xml文件,打开web.xml,里面内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

里面的“http://java.sun.com/dtd/web-app_2_3.dtd”就是使用了公共关联,按住Ctrl点击,可关联到此文档。

(2)元素

 格式:<!ELEMENT 元素名称 元素内容的类型>

  符号:

                 ? : 0或1

                + : >=1

                 * : >=0

                 (): 分组

                 | : 选择

                 ,: 顺序

    类型:

  • #PCDATA,只能书写字符,不能包含子元素,注意: (#PCDATA)
  • EMPTY,元素内容为空
  • ANY,元素内容任意

例:book.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT books (book+)>
<!ELEMENT book (name,author*,version?,(year|price))>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT version (#PCDATA)>
<!ELEMENT year EMPTY>
<!ELEMENT price EMPTY>

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "book.dtd">
<books>
<book>
    <name>Java</name>
    <author>LXH</author>
    <author>HLD</author>
    <version>v1.1</version>
    <price></price>
</book>
<book>
    <name>C++</name>
    <author>HLD</author>
    <year/>
</book>
</books>

(3)属性

         格式:<!ATTLIST 元素名称 [属性名称 属性类型 约束 ...]>

属性类型及其含义:

技术分享

约束的四种形式:

  •  #REQUIRED,必须填写
  •  #IMPLIED,可选
  •   #FIXED value,固定值
  •   defaultValue,默认值

例:book.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT books (book+)>
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book
    id ID #REQUIRED
    title CDATA #IMPLIED
    lang CDATA #FIXED "固定值"
    category CDATA "默认值"
    pid IDREF #REQUIRED
    city (北京|上海|广州) #REQUIRED
>

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "book.dtd">
<books>
<book id="B001" title="" pid="B001" city="上海">
    <name>Java</name>
    <price></price>
</book>
<book id="B002" title="" category="类别" pid="B002" city="上海">
    <name>Java</name>
    <price></price>
</book>
</books>

(4)实体

         实体是变量,用于引用普通文本或特殊字符的快捷方式的变量。

实体分为内部实体和外部实体。

  • 内部实体

内部实体分为引用实体和参数实体:

*引用实体:主要在 XML 文档中被应用。

  •  格式:<!ENTITY 实体名称 "内容">
  •  使用位置:在xml文档中使用
  •  使用格式:&实体名称;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books[
    <!ENTITY bookname "java">
    <!ELEMENT books (book+)>
    <!ELEMENT book (name,price)>
    <!ATTLIST book
        id ID #REQUIRED
        title CDATA #IMPLIED
        lang CDATA #FIXED "固定值"
        category CDATA "默认值"
        pid IDREF #REQUIRED
        city (北京|上海|广州) #REQUIRED
    >
]>
<books>
<book id="B002" title="" category="类别" pid="B002" city="上海">
    <name>&bookname;</name>
    <price>40</price>
</book>
</books>

*参数实体:被 DTD 文件自身使用

  • 格式:<!ENTITY % 实体名称 "内容">
  • 使用位置:在DTD文档中使用
  • 使用格式:%实体名称
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % fieldVal "name,age">
<!ELEMENT persons (person+,user+)>
<!ELEMENT person (%fieldVal;,tel)>
<!ELEMENT user (%fieldVal;,sal)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT sal (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "book.dtd">
<persons>
    <person>    
        <name>zhangsan</name>
        <age>32</age>
        <tel>1234</tel>
    </person>
    <user>
        <name>ls</name>
        <age>24</age>
        <sal>889</sal>
    </user>
</persons>

*外部实体

  • 格式:<!ENTITY 实体名称 SYSTEM "URI">
  • 使用位置:在xml文档中使用
  • 使用格式:&实体名称;

part.xml

<?xml version="1.0" encoding="UTF-8"?>
<entity>测试外部实体</entity>

book.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY part SYSTEM "part.xml">
<!ELEMENT books (book+)>
<!ELEMENT book ANY> <!--(#PCDATA)不能有子元素-->

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "book.dtd">
<books>
    <book>&part;</book> 
</books>

<book>&part;</book>相当于<book><entity>测试外部实体</entity></book>

3.2 schema约束

XML Schema 文件自身就是一个XML文件,扩展名为*.xsd。XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每个元素/属性的数据类型。

  • l  编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上
  • l  在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间
  • l  以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束

schema文档,根元素是schema,在http://www.w3.org/2001/XMLSchema定义

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

books为根元素

【targetNamespace】为当前的schema文档命名,属性在自定义。但是,要求全球唯一,采用URL域名进行命名。

【xmlns】xml namespace ——>xml命名空间。引用已有的命名空间,官方为自己的schema文档起的名称。

【xmlns:tns】

格式1:  xmlns:别名

使用:tns:schema,从当前别名tns所代表的schema文档中定义了schema元素

格式2 xmlns(默认命名空间引用)

                   好处:防止命名冲突

【elementFormDefault="qualified"】 指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

命名空间的使用在XML中主要有两个目的:

n  用于区分那些名称相同但来自不同schema库,具有不同含义的元素和属性。通过将元素、属性与URL相关联,命名空间能够区分具有相同名称的元素

n  在一个单一的XML应用中,将相关的元素和属性组合起来,使它们可以很容易地被软件包识别。

名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示,仅起到唯一标识的作用。

n  默认命名空间声明:不带前缀 ,默认命名空间只能有一个

  • 格式:xmlns=“url”
  • 例如:xmlns="http://www.w3.org/2001/XMLSchema"

n  显式命名空间声明:声明时指定前缀

  • 格式:xmlns: quoteName =“url”
  • 例如: xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。并且根元素schema节点必须来自http://www.w3.org/2001/XMLSchema 命名空间,官方建议使用使用前缀 xs ,及xmlns:xs。

Schema相对于DTD的明显好处是,XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。

在文档关联中,如何确定文件的位置?

官方规定“http://www.w3.org/2001/XMLSchema-instance” 将当前的xml文档实例化

* schemaLocation属性(两个参数空格隔开)

* 第一参数:实例化所需要的schema文档的名称

* 第二参数:schema文档的URI

定义根元素element:<别名:element name=””>

调用schema(book.xml)

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/books" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/books books.xsd"
>
</books>

XML Schema基础概念:

简易元素:仅包含文本的元素。它不会包含任何其他的元素或属性。

复合元素:包含其他元素及/或属性的 XML 元素

l  空元素

l  包含其他元素的元素

l  仅包含文本的元素

l  包含元素和文本的元素

Schema文档中出现的元素标记

元素类型

描述

schema

声明一个已经声明的schema

element

声明一个元素

attribute

声明一个属性

simpleType

定义一个简单类型,它决定了元素和属性值的约束和相关信息

complexType

定义一个复合类型,它决定了一组元素和属性值的约束和相关信息

group

把一组元素声明组合在一起,以便它们能够一起被复合类型应用

attributeGroup

把一组属性声明组合在一起,以便它们能够一起被复合类型应用

simpleContent

应用于complexType,对它的内容进行约束和扩展等

choice

允许唯一的一个元素从一组中被选择

list

从一个特定数据类型的集合中选择定义一个简单类型元素

union

从一个特定简单数据类型的集合中选择定义一个简单类型元素

unique

定义一个属性或元素值,它必须在一个特定的范围内

sequence

给一组元素一个特定的序列

restriction

定义一个约束条件

例1:定义一个简单元素

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

    <element name="books">
        <complexType>
            <sequence>
                <!-- 1、定义元素 -->
                <element name="ele"></element>
              <!—所有的元素必须定义在跟元素下面(这里) -->
</sequence>
        </complexType>
    </element>
</schema>

对应的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!—-对应的xml文档-->
<books xmlns="http://www.example.org/books" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/books books.xsd"
>
    <ele></ele>
</books>

例2:定义元素包含子元素,子元素顺序出现

<element name="person">
    <complexType>
        <sequence>  <!-- 顺序 -->
            <element name="name"></element>
            <element name="age"></element>
        </sequence>
    </complexType>
</element>

例3:定义含有子元素的元素--任选一个

<element name="user">
    <complexType>
        <choice><!-- 选择 -->
            <element name="name"></element>
            <element name="age"></element>
        </choice>
    </complexType>
</element>

例4:定义含有子元素的元素--子元素没顺序

<element name="worker">
    <complexType>
        <all><!-- 无序的 -->
            <element name="name"></element>
            <element name="age"></element>
        </all>
    </complexType>
</element>

例5.1:仅含有属性的空元素

<element name="img">
    <complexType>
        <attribute name="src" type="string"/>
    </complexType>
</element>

例5.2:仅含有属性的空元素,属性必须写

<element name="img">
    <complexType>
        <!—【use】 optional:可选、required:必选、prohibited:禁用-->
        <attribute name="src" type="string" use="required"/>
    </complexType>
</element>

例6:必须含有属性的非空元素

<!-- <price unit="¥">30</price>     -->
<element name="price">
    <complexType> <!-- 类型为复合元素 -->
        <simpleContent><!-- 内容简单 -->
            <!--将简单的内容扩展成复杂的类型 【base】确定简单内容的类型  -->
            <extension base="integer">
            <!-- 定义属性:【name】确定名称、【type】确定类型、【use】optional:可选、required:必选、prohibited:禁用-->
                 <attribute name="unit" type="string" use="required">
                 </attribute>
            </extension>
        </simpleContent>
    </complexType>
</element>

例7:必须含有属性也包含子元素的元素

 <element name="book">
                     <complexType>
                         <sequence>
                             <element name="title" type="string"></element>
                         </sequence>
                         <attribute name="catagory" type="string"></attribute>
                     </complexType>
                 </element>

例8、元素内容必须是2-5之间的数

<element name="number">
    <simpleType>
        <restriction base="int"><!-- 限制 -->
            <maxInclusive value="5"/>
            <minInclusive value="2"/>
        </restriction>
    </simpleType>
</element>

例9:包含多个指定元素

<!--<students>
    <student></student>
    <student></student>
</students>
minOccurs:最小出现次数,默认为1
maxOccurs:最大出现次数,默认为1
?——>minOccurs=0;    maxOccurs =1
+ ——>minOccurs=1;    maxOccurs =unbounded
* ——>minOccurs=0;    maxOccurs =unbounded    
 -->
<element name="students">
    <complexType>
        <sequence minOccurs="1" maxOccurs="unbounded">
            <element name="student"></element>
        </sequence>
    </complexType>
</element>

例10:将身份证号格式化

<element name="personId">
    <simpleType>
        <restriction base="string">
            <pattern value="\d{6}-\d{8}-\d{4}"></pattern>
        </restriction>
    </simpleType>
</element>

技术分享

属性相关定义

l  attribute元素的use属性来定义是否是必须的属性

  • required是必须值
  • optional是可选值
  • prohibited是无属性值

l  缺省值如何定义

  • <attribute name="quantity" type="integer" default="1"/>

l  固定值如何定义

  • <attribute name="name" fixed="张三"></attribute

Schema和DTD区别

XML从SGML (Standard Generalized Markup Language,标准通用标记语言)中继承了DTD,并用它来定义内容的模型,验证和组织元素。同时,它也有很多局限:

  • DTD不遵守XML语法;
  • DTD不可扩展;
  • DTD不支持命名空间的应用;
  • DTD没有提供强大的数据类型支持,只能表示很简单的数据类型。

Schema完全克服了这些弱点,使得基于Web的应用系统交换XML数据更为容易。下面是它所展现的一些新特性:

  • Schema完全基于XML语法,不需要再学习特殊的语法;
  • Schema能用处理XML文档的工具处理,而不需要特殊的工具;
  • Schema大大扩充了数据类型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等;
  • Schema支持原型,也就是元素的继承。如:我们定义了一个“联系人”数据类型,然后可以根据它产生“朋友联系人”和“客户联系”两种数据类型;
  • Schema支持属性组。我们一般声明一些公共属性,然后可以应用于所有的元素,属性组允许把元素、属性关系放于外部定义、组合;
  • 开放性。原来的DTD只能有一个DTD应用于一个XML文档,现在可以有多个Schema运用于一个XML文档。

 

第1天 XML和DTD、schema约束