XML、Schema学习笔记

XML

认识

什么是 XML?

  • XML 指可扩展标记语言EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性
  • XML 是 W3C 的推荐标准。

XML 和 HTML 之间的差异

HTML 旨在显示信息,而 XML 旨在传输信息。


XML 不会做任何事情

仅用来结构化、存储以及传输信息,我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

基础

XML 树结构

第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。

<?xml version="1.0" encoding="UTF-8"?>

下一行描述文档的根元素,XML 文档必须包含根元素。该元素是所有其他元素的父元素。

<任意字符></任意字符>

根元素里是子元素,所有的元素都可以有子元素,所有的元素都可以有文本内容和属性

XML 标签对大小写敏感

XML 属性值必须加引号

<note date="12/11/2007">

特殊字符-实体引用

在 XML 中,一些字符拥有特殊的意义,为了避免错误,用实体引用来代替:

实体引用对应字符
&lt;<
&gt;>
&amp;&
&apos;
&quot;"
<message>if salary &lt; 1000 then</message>

在 XML 中,空格会被保留

XML 命名规则

XML 元素必须遵循以下命名规则:

  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格

XML格式验证

合法的 XML 文档是"形式良好"的 XML 文档,这也符合文档类型定义(DTD)的规则:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

重点在第二行<!DOCTYPE note SYSTEM "Note.dtd">

DOCTYPE 声明是对外部 DTD 文件的引用。

XML DTD

DTD 的目的是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:

<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
XML Schema

XML Schema是一种基于 XML 的 DTD 代替者:

<xs:element name="note">

<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>

</xs:element>

进阶

XML 命名空间

在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。

XML 命名空间赋予命名空间一个惟一的名称,从而避免元素命名冲突。

命名空间 URI 不会被解析器用于查找信息,但很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

使用前缀来避免命名冲突
<h:table>...</h:table>
<f:table>...</f:table>
使用默认的命名空间(即不带前缀)

为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。它的语法如下:

<table xmlns="http://www.w3.org/TR/html4/">
    ……
</table>
xmlns 属性定义命名空间前缀和名称

命名空间在元素的开始标签的 xmlns 属性中定义,声明的语法为xmlns:前缀="URI"

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

可以在一个开始标签定义多个xmlns 属性。

XML CDATA

CDATA 区段中的文本不会被解析器解析

而其他所有文本均会被解析器解析(称为PCDATA - 被解析的字符数据)。

CDATA 部分由 “<![CDATA[**" 开始,由 "**]]>” 结束:

<script>
<![CDATA[我是
不会被解析
的文本
]]>
</script>

其他不太重要的点

使用 CSS 来格式化 XML 文档

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CATALOG>……</CATALOG>

使用 XSLT 显示 XML

XSLT(eXtensible Stylesheet Language Transformations)是首选的 XML 样式表语言,远比 CSS 更加完善。

XSLT 是在浏览器显示 XML 文件之前,先把它转换为 HTML

XML Schema

什么是 XML Schema?

XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。

XML Schema:

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的次序
  • 定义子元素的数目
  • 定义元素是否为空,或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值

对 XML Schema 的引用

在开始标签使用xmlns:xsi和xsi:schemaLocation属性:

<?xml version="1.0"?>
<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

xmlns:xsi="xxx"定义一个前缀为xsi的命名空间,xsi 已经成为了一个业界默认的用于 XSD((XML Schema Definition) 文件的命名空间。

xsi:schemaLocation="xxx xxx"xsi:noNamespaceSchemaLocation="xxx"对前缀为xsi的这个命名空间指定XML Schema,xsi:schemaLocation需先后填写schema文档的命名空间和schema文档的地址;xsi:noNamespaceSchemaLocation只需要填地址,前提是地址指向的schema文件没有命名空间

XSD - <schema> 元素

元素是每一个 XML Schema 的根元素。

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.runoob.com"
xmlns="http://www.runoob.com"
elementFormDefault="qualified">
...
...
</xs:schema>

以下代码片段:

xmlns:xs="http://www.w3.org/2001/XMLSchema"表示该schema中的元素和数据类型来自该命名空间,并在使用的时候需要加前缀“xs”

targetNamespace="http://www.runoob.com"表示被此 schema 定义的元素 来自该命名空间

xmlns="http://www.runoob.com"表示默认的命名空间。

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

自定义简易元素

<xs:element name="xxx" type="yyy"/>

例如,定义一个名为age值为数值的xml元素:

<age>36</age>

<xs:element name="age" type="xs:integer"/>

默认值和固定值

default属性指定默认值,fixed属性指定固定值

当没有给元素指定值的时候默认值生效

固定值相当于定义了一个不可变常量值

<xs:element name="color" type="xs:string" default="red"/>

<xs:element name="color" type="xs:string" fixed="red"/>

常用数据类型

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

自定义元素属性

简易元素无法拥有自定义属性,否则自动当作某种复合类型

<xs:attribute name="xxx" type="yyy"/>

示例:

这是带有属性的 XML 元素:
<lastname lang="EN">Smith</lastname>
这是对应的属性定义:
<xs:attribute name="lang" type="xs:string"/>

默认值和固定值

与自定义元素一样,属性也可以设置默认值和固定值,方式与自定义元素一致

可选与必选

自定义属性默认可选,可通过use="required"设置为必选:

<xs:attribute name="lang" type="xs:string" use="required"/>

自定义元素的值的限定

限制指定元素的取值规则

限定描述
enumeration定义可接受值的一个列表
fractionDigits定义所允许的最大的小数位数。必须大于等于0。
length定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive定义数值的上限。所允许的值必须小于此值。
maxInclusive定义数值的上限。所允许的值必须小于或等于此值。
maxLength定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive定义数值的下限。所允许的值必需大于此值。
minInclusive定义数值的下限。所允许的值必需大于或等于此值。
minLength定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern定义可接受的字符的精确序列。
totalDigits定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace定义空白字符(换行、回车、空格以及制表符)的处理方式。①"preserve"表示不处理,②"replace"表示移除所有空白字符,③"collapse"表示移除开头结尾的空白字符并将中间多个连续空白字符替换为一个

示例:

<xs:element name="car">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Audi"/>
      <xs:enumeration value="Golf"/>
      <xs:enumeration value="BMW"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

上面的例子也可以被写为:

<xs:simpleType name="carType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="car" type="carType"/>

这样的话,该限定类型 “carType” 可被其他元素使用。

其他例子:

<xs:element name="age">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

<xs:element name="password">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="8"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

<xs:element name="password">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-zA-Z0-9]{8}"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

<xs:element name="address">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

自定义复合元素

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

有四种类型的复合元素:

  • 空元素(只有属性没有其他):<product pid="1345"/>
  • 包含其他元素的元素:<employee><lastname>Smith</lastname></employee>
  • 仅包含文本的元素:<food type="dessert">Ice cream</food>
  • 包含元素和文本的元素:<description>It happened on <date lang="norwegian">03.03.99</date></description>

如何定义复合元素?

仅包含元素——<complexType>
<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element><xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
包含元素和文本——<complexType mixed="true">

这样文本就可以出现在子元素的前后了

<letter>
  Dear Mr.<name>John Smith</name>.
  Your order <orderid>1032</orderid>
  will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
<xs:element name="letter" type="lettertype"/>
<xs:complexType name="lettertype" mixed="true">
  <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="orderid" type="xs:positiveInteger"/>
    <xs:element name="shipdate" type="xs:date"/>
  </xs:sequence>
</xs:complexType>
仅包含文本——<complexType><simpleContent>

例子声明了一个复合类型,其内容被定义为整数值,并且 “shoesize” 元素含有名为 “country” 的属性:

<shoesize country="france">35</shoesize>
<xs:element name="shoesize" type="shoetype"/>
<xs:complexType name="shoetype">
  <xs:simpleContent>
    <xs:extension base="xs:integer">
      <xs:attribute name="country" type="xs:string" />
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

XSD指示器(子元素顺序、频率)

Order 指示器

Order 指示器用于定义元素的顺序。

All 指示器

指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:

<xs:element name="person">
  <xs:complexType>
    <xs:all>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

注意: 当使用 指示器时,你可以把 设置为 0 或者 1,而只能把 指示器设置为 1(也就是控制出现频率,稍后讲解)。

Choice 指示器

指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼):

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>
Sequence 指示器

规定子元素必须按照特定的顺序出现:

<xs:element name="person">
   <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
Occurrence 指示器

Occurrence 指示器用于定义某个元素出现的频率。

注意: 对于所有的 “Order” 和 “Group” 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。

maxOccurs 指示器、minOccurs 指示器

指示器可规定某个元素可出现的最大次数,其中无限制为maxOccurs=“unbounded”

指示器可规定某个元素能够出现的最小次数,默认值是 1

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string" minOccurs="0"/>
      <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的例子表明,子元素 “full_name” 可在 “person” 元素中出现最少 0 次,子元素 “child_name” 可在 “person” 元素中最少出现一次(其中 ),最多出现 10 次。

Group 指示器

Group 指示器用于定义相关的数批元素。(?用在复合元素的定义里面)

元素组

元素组通过 group 声明进行定义,必须在 group 声明内部定义一个 all、choice 或者 sequence 元素。下面这个例子定义了名为 “persongroup” 的 group,它定义了必须按照精确的顺序出现的一组元素:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:group ref="persongroup"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
属性组

属性组通过 attributeGroup 声明来进行定义:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

<xs:element name="person">
  <xs:complexType>
    <xs:attributeGroup ref="personattrgroup"/>
  </xs:complexType>
</xs:element>

元素

元素可以理解为一个参数占位符,这个参数并没有在当前元素中被声明,但它可以表示任何其他的参数

例如有这样的schema 文件,名为 “test.xsd”:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
    
<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:any minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

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

那么下面这个xml文件是有效的:

<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns="http://www.microsoft.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.microsoft.com test.xsd">

<person>
  <firstname>Hege</firstname>
  <lastname>Refsnes</lastname>
  <children>
    <childname>Cecilie</childname>
  </children>
</person>

<person>
  <firstname>Stale</firstname>
  <lastname>Refsnes</lastname>
</person>

</persons>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值