元素 ELEMENT
元素是xml的核心和灵魂。在DTD中,元素类型是通过ELEMENT标记声明的。此外,标记还提供所声明类型的名称和内容贵含。
命名规则:名称可以是字母、数字,也可以使用标点符号,名称不能以数字开头。它的第一个字符只能是字母、下划线或冒号。
冒号:为避免与命名空间的保留用法,最好避免在元素名称中使用冒号。
元素内容 四种类型 : 空,元素,复合,任意。
空元素:即不包含文本,也不包含子元素,但是可以有属性,用关键 字EMRTY声明。
元素:更确切说是纯元素,只包含子元素,而不包含文本。
复合:元素和可解析字符数据(#PCDATA)或文本的组合。
任意:同名称含义,任意。使用关键字ANY声明
e.g
<! ELEMENT ANY >
//SomeDate类型实例
< SomeDate />
XML定义的某些属性类型可以用来表示一对一或一对多关系。如果你要说明的仅仅是关系本身,空元素是最适合不过的。
AnyOldThing声明为ANY内容,因为可以使用元素和文本的任意组合。一般而言使用ANY内容要格外谨慎,因为解析器基本上不能提供有效性验证
复合内容和元素内容采用内容模型(content model)表示。内容模型是一种规范,定义了元素内容的内部结构,即元素结构的声明。
内容模型组成:由圆括号包含的若干子元素名称、运算符和#PCDATA关键字的组合。
运算符用于说明元素包含的元组。元素和字符数据之间的组合关系。
顺序运算符 , 表示严格顺序
| 表示选择
以逗号分割的列表表示顺序排列的元素。
以管道分割的列表表示选择排列的元素。
e.g
<! ELEMENT FruitBasket (Apple|Orange) >
<! ELEMENT FruitBasket1 (Cherry,(Apple|Orange)) >
在PersonName实例中,First,Middle,Last必须按指定的顺序出现。
在FruitBasket实例中,必须从Apple和Orange中选择其一。
在FruitBasket1实例中,必须包含两个元素:Cherry以及Apple或Oran ge,且它们必须按照指定的顺序出现(第二个参数可以从Apple或Oran ge中选择其一)
所以元素实例只能有以下两种形式
e.g
< Cherry > //some code </ Cherry >
< Apple > //some code </ Apple >
</ FruitBasket1 >
or
< FruitBasket1 >
< Cherry > //some code </ Cherry >
< Orange > //some code </ Orange >
</ FruitBasket1 >
元组运算符
? 可以选的;可有可无
* 零个或多个
+ 一个或多个
如果没有元组运算符,说明元组数为一。元组运算符可以用于元素或内容模型,它能够产生许多非常复杂的结构。
e.g
以上声明说明FruitBasket可以有一个或多个元素Cherry的实例,以及零个或多个Apple或Orange的实例。而所有cherry元素必须连续出现。
e.g
< Cherry > //some code </ Cherry >
< Cherry > //some code </ Cherry >
< Cherry > //some code </ Cherry >
< Apple > //some code </ Apple >
< Orange > //some code </ Orange >
< Orange > //some code </ Orange >
</ FruitBasket >
如果需要表示复合内容,需要在内容模型中包含#PCDATA。内容模型中的元素必须以|运算符分割。而且整个组声明为”*“:
<!ELEMENT MixedBag (#PCDATA|ItemA|ItemB)*>
使用复合内容模型时,#PCDATA关键字必须是模型中的第一个选项。
考虑以下内容模型,看看它们各自表达什么含义:
元素foo包含两个子元素,第一个永远是元素A。第二个是B或C。
foo包含两个或三个按顺序排列的子元素。其中 B是可选的。
元素 foo可以包含重复的A、B对列表,或者一个单独的 C或D。
借助内容模型,可以产生变化多样的子内容实例。例如:
元素foo可以包含一个A,零个或多个B、C对,以及至少一个D。