构建XML
开始创建 XML 文件
XML 文档的第一行可以是一个 XML 声明。这是文件的可选部分,它将文件识别为 XML 文件,有助于工具和人类识别 XML(不会误认为是 SGML 或其他标记)。可以将这个声明简单地写成 <?xml?>
,或包含 XML 版本(<?xml version="1.0"?>
),甚至包含字符编码,比如针对 Unicode 的 <?xml version="1.0" encoding="utf-8"?>
。因为这个声明必须出现在文件的开头,所以如果打算将多个小的 XML 文件合并为一个大 XML 文件,则可以忽略这个可选信息。
根元素的开始和结束标记用于包围 XML 文档的内容。一个文件只能有一个根元素,并且需要使用 “包装器” 包含它。清单 1 显示了经过删节的示例,其中的根元素名为 <recipe>
。
<recipe>
</recipe>
在构建文档时,内容和其他标记必须放在 <recipe>
和 </recipe>
之间。
|
到目前为止,都使用 <recipe>
作为根元素。在 XML 中,先要为元素选择名称,然后再根据这些名称定义相应的 DTD 或 schema。创建名称时可以使用英文字母、数字和特殊字符,比如下划线(_
)。下面给出命名时需要注意的地方:
- 元素名中不能出现空格。
- 名称只能以英文字母开始,不能是数字或符号。(在第一个字母之后就可以使用字母、数字或规定的符号,或它们的混合)。
- 对大小写没有限制,但前后要保持一致,以免造成混乱。
我们继续以前面的示例为例,如果添加了名为 <recipename>
的元素,它将有一个开始标记 <recipename>
和相应的结束标记 </recipename>
。
<recipe>
<recipename>Ice Cream Sundae</recipename>
<preptime>5 minutes</preptime>
</recipe>
XML 文档可以使用内部不包含任何内容的空标记,这些标记可以表示为单个标记,而不是一组开始和结束标记。以类似于 HTML 的文件为例,里面的 <img src="mylogo.gif">
是一个独立的元素。它不包含任何子元素或文本,因此它是一个空元素,您可以将它表示为 <img src="mylogo.gif" />
(以一个空格和熟悉的终止斜杠结束)。
嵌套 即把某个元素放到其他元素的内部。这些新的元素称为子 元素,包含它们的元素称为父 元素。<recipe>
根元素中嵌套有几个其他元素,如 清单 3 所示。这些嵌套的子元素包括 <recipename>
、<ingredlist>
和 <preptime>
。<ingredlist>
元素内部包含多个子元素 <listitem>
。XML 文档可以使用多层嵌套。
一个常见的语法错误是父元素和子元素的错误嵌套。任何子元素都要完全包含在其父元素的开始和结束标记内部。每个同胞(Sibling)元素必须在下一个同胞元素开始之前结束。
下面的代码显示了正确的嵌套。这些标记的开始和结束没有与其他标记混合 在一起。
<recipe>
<recipename>Ice Cream Sundae</recipename>
<ingredlist>
<listitem>
<quantity>3</quantity>
<itemdescription>chocolate syrup or chocolate fudge</itemdescription>
</listitem>
<listitem>
<quantity>1</quantity>
<itemdescription>nuts</itemdescription>
</listitem>
<listitem>
<quantity>1</quantity>
<itemdescription>cherry</itemdescription>
</listitem>
</ingredlist>
<preptime>5 minutes</preptime>
</recipe>
有时候要为元素添加属性。属性由一个名称-值对构成,值包含在双引号中("
),比如:type="dessert"
。属性是在使用元素时存储额外信息的一种方式。在同一个文档中,可以根据需要对每个元素的不同实例采用不同的属性值。
您可以在元素的开始标记内部输入一个或多个属性,比如:<recipe type="dessert">
。如果要添加多个属性,各个属性之间使用空格分开,比如:<recipename cuisine="american" servings="1">
。
<recipe type="dessert">
<recipename cuisine="american" servings="1">Ice Cream Sundae</recipename>
<preptime>5 minutes</preptime>
</recipe>
您可以根据需要使用任意数量的属性。要考虑需要添加到文档的细节。如果要对文档分类,属性尤其有用,比如按照菜谱的 type
进行分类。属性名可以包含在元素名中使用的字符,规则也是类似的,即字符之间不能带有空格,名称只能以字母开始。
构造良好并且有效的 XML
如果您根据结构规则创建 XML,就很容易实现构造良好的 XML。
要实现构造良好的 XML 取决于如何处理 XML。但考虑一下前面提到的示例,它要求根据菜谱类型进行分类。您需要确保每个 <recipe>
元素都包含 type
属性,以对菜谱进行分类。能够正确验证并确保存在属性值是非常重要的(避免出现双关语)。
验证 就是根据元素规则检查文档的结构,以及如何为每个父元素定义子元素。这些规则是在 文档类型定义(Document Type Definition,DTD)或模式(schema )中定义的。验证要求您创建自己的 DTD 或 schema ,然后在 XML 文件中引用 DTD 或 schema 文件。
为了实现验证,必须在 XML 文档的顶部附近包含文档类型(DOCTYPE
)。这行代码将引用用于验证文档的 DTD 或 schema (元素和规则列表)。
这个例子假设元素列表文件的名称是 filename.dtd,并且位于您的计算机上(如果指向公共文件位置,则 SYSTEM
和 PUBLIC
是相对的)。
实体 可以是文本短语或特殊字符。它们可以指向内部或外部。必须正确地声明和表示实体,以避免错误和确保正确显示。
您不能直接在内容中输入特殊字符。如果要在文本中使用符号,必须使用它的字符代码将它设置为实体。您可以将短语(比如公司名)设置为实体,然后就可以在内容中使用该实体。为了设置实体,必须先为它创建一个名称,然后将它输入到内容中,以 and 符号(&
)开始,并以分号(;
)结束 — 例如,&coname;
。然后在 DOCTYPE
的方括号([]
)内部输入代码,如下所示.这个代码识别表示实体的文本。
Industries"
]>
使用实体可以避免反复输入相同的短语和信息。在很多情况下它还使得调整文本更加容易(变更公司名时),只需对实体定义进行简单调整。
在学习创建 XML 文件时,在 XML 编辑器中打开它,以检查它的结构是否良好,并且确保您遵循 XML 规则。例如,如果您使用 Windows® Internet Explorer®,就可以在浏览器中打开 XML。如果它能够显示 XML 元素、属性和内容,则表明 XML 是构造良好的。相反,如果显示错误,则很可能是出现语法错误,您需要小心检查文档,看看是不是丢失标记和标点符号或输入错误。
如在 嵌套元素 小节中提到的一样,包含其他元素的元素就是被包含元素的父元素。在下面的示例中,<recipe>
是根元素,并且包含文件的完整内容。父元素 <recipe>
包含的子元素有 <recipename>
、<ingredlist>
、<directions>
等等。在这种结构中,<recipename>
、<ingredlist>
和 <directions>
成了同胞元素。此外,还要正确嵌套同胞 元素。下面 给出了构造良好并且正确嵌套的 XML。
<recipe type="dessert">
<recipename cuisine="american" servings="1">Ice Cream Sundae</recipename>
<ingredlist>
<listitem><quantity units="cups">0.5</quantity>
<itemdescription>vanilla ice cream</itemdescription></listitem>
<listitem><quantity units="tablespoons">3</quantity>
<itemdescription>chocolate syrup or chocolate fudge</itemdescription></listitem>
<listitem><quantity units="tablespoons">1</quantity>
<itemdescription>nuts</itemdescription></listitem>
<listitem><quantity units="each">1</quantity>
<itemdescription>cherry</itemdescription></listitem>
</ingredlist>
<utensils>
<listitem><quantity units="each">1</quantity>
<utensilname>bowl</utensilname></listitem>
<listitem><quantity units="each">1</quantity>
<utensilname>spoons</utensilname></listitem>
<listitem><quantity units="each">1</quantity>
<utensilname>ice cream scoop</utensilname></listitem>
</utensils>
<directions>
<step>Using ice cream scoop, place vanilla ice cream into bowl.</step>
<step>Drizzle chocolate syrup or chocolate fudge over the ice cream.</step>
<step>Sprinkle nuts over the mound of chocolate and ice cream.</step>
<step>Place cherry on top of mound with stem pointing upward.</step>
<step>Serve.</step>
</directions>
<variations>
<option>Replace nuts with raisins.</option>
<option>Use chocolate ice cream instead of vanilla ice cream.</option>
</variations>
<preptime>5 minutes</preptime>
</recipe>
注意:换行符方便您阅读代码,它不会影响 XML。
您可以在测试文件上进行实践,去掉开始和结束标记,熟悉因此显示的错误消息。
-----------------------------------------------------------
佛对我说:你心里有尘。我用力的拭擦。