XML 指的是 eXtensible Markup Language, 可扩展标记语言.
XML 系列教程
http://www.w3school.com.cn/x.asp
以一个 XML 声明开始, 形如
声明为:
<?xml version = "1.0" standalone = "yes" ?>
<?xml version = "1.0" encoding="ISO-8859-1" ?>
XML 的声明不需要闭标签. 其余XML的元素均需要闭标签.
文档需要有一个
标签通常是成对出现的, 如
也允许单标签, 如
标签可以随意嵌套.
XML 标签是大小写敏感的.
<?xml version = "1.0" standalone = "yes" ?>
<BARS>
<BAR>
<NAME>Joe's Bar</NAME>
<BEER>
<NAME>Bud</NAME>
<PRICE>2.50</PRICE>
</BEER>
<BEER>
<NAME>Miller</NAME>
<PRICE>3.00</PRICE>
</BEER>
</BAR>
<BAR>
...
</BAR>
</BARS>
<!DOCTYPE <root tag> [ <!ELEMENT <name> (<componets>)> ... more elements ... ]>
元素的描述由它的标签名称和由圆括号括起来的任意嵌套子标签的描述组成.
叶子(文本元素) 有
XML 中的CDATA区(CDATA section)允许对XML处理器隐藏类似 < 和 & 的字符. 这是因为这些字符具有特殊的意义:
一个CDATA区以字符 <![CDATA[ 开始, 以 ]]> 结束. 例如:
<company><![CDATA[Fitzgerald & Daughters]]></company>
<!DOCTYPE BARS [ <!ELEMENT BARS (BAR*)> <!ELEMENT BAR (NAME, BEER+)> <!ELEMENT NAME (#PCDATA)> <!ELEMENT BEER (NAME,PRICE)> <!ELEMENT PRICE (#PCDATA)> ]>
子标签必须依次出现.
标签名后面可以跟一个符号, 以表示它是否可以重复出现, 次数是多少.
符号
通常(西方)人名前面可以有一个头衔(比如: "Prof."), 然后是 first name, last name.
现在假设要表示这样一个元素
<!ELEMENT NAME ( (TITLE?, FIRST, LAST) | IPADDR )>
<?xml version = "1.0" standalone = "no" ?>
<!-- *** The DTD *** -->
<!DOCTYPE BARS [
<!ELEMENT BARS (BAR*)>
<!ELEMENT BAR (NAME, BEER+)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT BEER (NAME, PRICE)>
<!ELEMENT PRICE (#PCDATA)>
]>
<!-- *** The document *** -->
<BARS>
<BAR>
<NAME>Joe's Bar</NAME>
<BEER>
<NAME>Bud</NAME>
<PRICE>2.50</PRICE>
</BEER>
<BEER>
<NAME>Miller</NAME>
<PRICE>3.00</PRICE>
</BEER>
</BAR>
<BAR> ...
</BAR>
</BARS>
假设
<?xml version = "1.0" standalone = "no" ?>
<!DOCTYPE BARS SYSTEM "bar.dtd">
<BARS>
<BAR>
<NAME>Joe’s Bar</NAME>
<BEER>
<NAME>Bud</NAME>
<PRICE>2.50</PRICE>
</BEER>
<BEER>
<NAME>Miller</NAME>
<PRICE>3.00</PRICE>
</BEER>
</BAR>
<BAR> ...
</BAR>
</BARS>
第二行
XML 中的开始标签可以包含
在 DTD 中,
声明了元素
<!ELEMENT BAR (NAME BEER*)> <!ATTLIST BAR kind CDATA #IMPLIED>
在一个允许使用
<BAR kind = "sushi">
<NAME>Homma's</NAME>
<BEER>
<NAME>Sapporo</NAME>
<PRICE>5.00</PRICE>
</BEER>
...
</BAR>
属性可以作为一个对象到另一个对象的指针.
允许 XML 文档成为一个普通的图(graph), 而不只是一个树(tree).
给定元素
当在 XML 文档中使用标签
如:
为使元素
或者, 令属性具有 IDREFS 类型, 从而
新的
<!DOCTYPE BARS [
<!ELEMENT BARS (BAR*, BEER*)>
<!ELEMENT BAR (SELLS+)>
<!ATTLIST BAR name ID #REQUIRED>
<!ELEMENT SELLS (#PCDATA)>
<!ATTLIST SELLS theBeer IDREF #REQUIRED>
<!ELEMENT BEER EMPTY>
<!ATTLIST BEER name ID #REQUIRED>
<!ATTLIST BEER soldBy IDREFS #IMPLIED>
]>
<BARS>
<BAR name = "JoesBar">
<SELLS theBeer = "Bud">2.50</SELLS>
<SELLS theBeer = "Miller">3.00</SELLS>
</BAR> ...
<BEER name = "Bud" soldBy = "JoesBar
SuesBar ..." /> ...
</BARS>
我们可以在元素的属性内部完成所有的工作.
另一个例子:
在 DTD 中, 声明:
<!ELEMENT SELLS EMPTY> <!ATTLIST SELLS theBeer IDREF #REQUIRED> <!ATTLIST SELLS price CDATA #REQUIRED>
文档中的
<SELLS theBeer = "Bud" price = "2.50" />
XML 模式是描述 XML 文档结构的另一种方式, 比 DTD 更为强大.
XML 模式的模式声明本身是一个 XML 文档.
<? xml version="1.0" encoding="utf-8" ?> <xs:schema xmlns:xs = "http://www.w3.org/2001/XMLschema"> ... </xs:schema>
Q: XML Schema 中如何声明空标签?
<xs:element name="NAME" type="xs:string" />
如:
为描述包含子元素的元素, 我们使用
一个复杂类型的典型子元素是
<xs:complexType name = "beerType">
<xs:sequence>
<xs:element name = "NAME" type = "xs:string"
minOccurs = "1" maxOccurs = "1" />
<xs:element name = "PRICE" type = "xs:float"
minOccurs = "0" maxOccurs = "1" />
</xs:sequence>
</xs:complexType>
参考 http://www.w3school.com.cn/schema/schema_complex_indicators.asp
<xxx> <NAME>Bud</NAME> <PRICE>2.50</PRICE> </xxx>
这里我们不知道属于此类型(
如果需要声明某个子元素从属于某个复杂类型, 则应在XML Schema中如下写明:
<xs:element name = "Movies">
<xs:complexType>
<xs:sequence>
<xs:element name="Movie" type="movieType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
详见书上P.306 图11-19的例子.
<xs:complexType name="barType">
<xs:sequence>
<xs:element name="NAME"
type="xs:string"
minOccurs="1" maxOccurs="1" />
<xs:element name="BEER"
type="beerType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
子元素
元素
<xs:complexType name = "beerType">
<xs:attribute name = "name"
type = "xs:string"
use = "required" />
<xs:attribute name = "price"
type = "xs:float"
use = "optional" />
</xs:complexType>
<xxx name="Bud" price="2.50" />
受限的简单类型中元素
<xs:simpleType name = "license">
<xs:restriction base = "xs:string">
<xs:enumeration value = "Full" />
<xs:enumeration value = "Beer only" />
<xs:enumeration value = "Sushi" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name = "price">
<xs:restriction base = "xs:float"
minInclusive = "1.00"
maxExclusive = "5.00" />
</xs:simpleType>
一个
含义: 在这个元素内, 被某个
例子: 在一个
<xs:element name = "BAR" ... >
. . .
<xs:key name = "barKey">
<xs:selector xpath = "BEER" />
<xs:field xpath = "@name" />
</xs:key>
. . .
</xs:element>
在元素
假设我们已经定义元素
我们希望声明
<xs:element name = "DRINKERS">
. . .
<xs:keyref name = "barRef"
refers = "barKey"
<xs:selector xpath = "DRINKER/FREQ" />
<xs:field xpath = "@bar" />
</xs:keyref>
</xs:element>