XML学习
XML,或称为可扩展标记语言(Extensible Markup Language),是一种您可以用来创建自己的标记的标记语言。它由万维网协会(W3C)创建,用来克服 HTML(即超文本标记语言(Hypertext Markup Language),它是所有网页的基础)的局限。和 HTML 一样,XML 基于 SGML — 标准通用标记语言(Standard Generalized Markup Language)。XML 是为 Web 设计的。
1.XML文档规则
XML 规范需要解析器拒绝任何没有遵守基本规则的 XML 文档。
区别于HTML:大多数 HTML 解析器接受随意的标记,它们会猜测文档作者的意图。为了避免一般的 HTML 文档中松散结构所造成的混乱,XML 的创造者们决定从一开始就强制文档结构。
三种XML文档:
- 无效文档
- 有效文档既遵守 XML 语法规则也遵守在其 DTD(文档类型定义) 或模式中定义的规则。
- 格式良好的文档遵守 XML 语法,但没有 DTD 或模式。
根元素(唯一性)
XML文档必须包含且只包含一个根元素。否则,XML 解析器都会拒绝解析。
元素不重叠
结束标记必需有
XML 元素区分大小写
区别于HTML:在 HTML 中,<h1>和<H1>是相同的;在 XML 中,它们是不同的。如果您试图用</H1>标记结束<h1>元素,将会出错。
属性规则:
XML 文档中的属性有两个规则:
可以使用单引号,也可以使用双引号,但要始终保持一致。
XML声明
建议使用 XML 声明,但它不是必需的。
声明包括三个属性:XML版本,字符集,standalone
;
standalone
(可以是yes或no)定义了是否可以在不读取任何其它文件的情况下处理该文档。默认情况下是no。
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
XML 文档中的其它项
您或许会在一个 XML 文档中发现其它几项:
- 注释:注释可以出现在文档的任何位置;它们甚至可以出现在根元素的前面或后面。注释以<!--开始,以-->结束。下面是包含注释的标记:
<!-- Here's a PI for Cocoon: -->
<?cocoon-process type="sql"?>
- 处理指令:处理指令是为使用一段特殊代码而设计的标记。在上面的示例中,有一个用于 Cocoon 的处理指令(有时称为 PI),Cocoon 是来自 Apache 软件基金会(Apache Software Foundation)的 XML 处理框架。当 Cocoon 处理 XML 文档时,它会寻找以cocoon-process开头的处理指令,然后相应地处理 XML 文档。在该示例中,type="sql"属性告诉 Cocoon:XML 文档包含一个 SQL 语句。
<!-- Here's an entity: -->
<!ENTITY dw "developerWorks">
- 实体:上面的示例为文档定义了一个实体。无论 XML 处理器在何处找到字符串&dw;,它都会用字符串developerWorks代替该实体。XML 规范还定义了五个您可以用来替代不同的特殊字符的实体。这些实体是:
< 代表小于符号
> 代表大于符号
" 代表一个双引号
' 代表一个单引号(或撇号)
& 代表一个“与”符号。
名称空间:
对于一个通讯录,书店,研究所可能具有相同的元素<title>。如何分辨这个特定的<title>指的是人、书籍还是某项研究条目呢?解决这个问题,可以使用名称空间。
<?xml version="1.0"?>
<object_summary
xmlns:addr="http://www.sun.com/addresses/"
xmlns:books="http://www.sun.com/books/"
xmlns:research="http://www.sun.com/title/"
>
... <addr:name><title>Mrs.</title> ... </addr:name> ...
... <books:title>Transformers</books:title> ...
... <research:title>Vega Information Grid</research:title> ...
在该示例中,三个名称空间前缀是 addr、books 和research。请注意,为特定元素定义名称空间意味着该元素的所有子元素都属于同一名称空间。第一个 <title> 元素属于 addr 名称空间,因为其父元素 <addr:Name> 属于该名称空间。
最后要指出的是:名称空间定义中的字符串仅仅是字符串。如:xmlns:addr="http://www.sun.com/addresses/看似 URL,其实不是。您可以定义 xmlns:addr="tmac",那也是有效的。名称空间唯一的重要性在于其唯一性;这就是为什么大多数名称空间定义看起来象 URL 的原因。
2.定义文档内容
- 一种方法是使用文档类型定义(Document Type Definition),或简称 DTD。DTD 定义可以在 XML 文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及 XML 文档结构的其它详细信息。DTD 是最初的 XML 规范的一部分,与 SGML DTD 非常相似。
- 另一种方法是使用 XML Schema。模式可以定义您能在 DTD 中使用的所有文档结构,它还可以定义数据类型和比 DTD 更复杂的规则。W3C 在提出最初的 XML 规范的几年之后开发了 XML Schema 规范。
DTD
允许您指定 XML 文档的基本结构。
特性:有序性。
符号说明:“?”表示可选(0次或1次)
“+”表示可多次出现(>=1次)
“*”表示可以出现可以不出现(>=0次)
“(A|B)?”表示A或B是可选项,只能选择其中之一
定义属性:
· 定义哪些属性是必需的
· 定义属性的缺省值
· 列出给定属性的所有有效值
<!ELEMENT city (#PCDATA)>
<!ATTLIST city postal-code CDATA #REQUIRED
state CDATA (AZ|CA|NV|OR|UT|WA) "CA">
#PCDATA代表已解析字符数据,不能在这些元素中包含另一个元素;
该示例将 state 和 postal-code 都定义为 <city> 元素的属性;
#REQUIRED 告诉解析器 postal-code 属性包含文本并且是必需的(如果它是可选的,用 CDATA #IMPLIED 即可);
state仅支持来自亚利桑那州(AZ)、加利福尼亚州(CA)、内华达州(NV)、俄勒冈州(OR)、犹他州(UT)和华盛顿州(WA)的地址,并且缺省值是加利福尼亚州。
文档示例的基本结构的 DTD:
<!-- address.dtd -->
<!ELEMENT address (name, street, city, state, postal-code)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT postal-code (#PCDATA)>
DTD 语法不同于普通的 XML 语法。(相反,XML Schema 文档本身就是 XML,这导致一些有趣的结果)。
XML
与 DTD 相比有几个优势:
- XML 模式使用 XML 语法。换句话说,XML 模式是一个 XML 文档。这意味着您可以象处理任何其它文档一样处理模式。例如,您可以编写一个 XSLT 样式表,该样式表将 XML 模式转换成具有自动生成的 JavaScript 代码的 Web 表单,其中的 JavaScript 代码可以验证您输入的数据。
- XML 模式支持数据类型。尽管 DTD 确实支持数据类型,但很明显这些数据类型是从发布的角度开发的。XML 模式支持 DTD 中的所有原始数据类型(诸如标识和标识引用之类的类型)。它们还支持整数、浮点数、日期、时间、字符串、URL 和其它对数据处理和验证有用的数据类型。
- XML 模式是可扩展的。除了 XML 模式规范中定义的数据类型以外,您还可以创建自己的数据类型,并且可以基于其它数据类型派生出新的数据类型。
- XML 模式有更强的表达能力。
要点:如要定义一个 XML 文档的结构,您应该象在应用程序中设计数据库模式或数据结构那样事先考虑 DTD 或模式。您事先考虑的未来需求越多,以后实现它们就越容易而且成本越低。
3.XML编程接口
文档对象模型(Document Object Model (DOM));
用于 XML 的简单 API(Simple API for XML (SAX));
JDOM ;
用于 XML 解析的 Java API(Java API for XML Parsing (JAXP))。
如何确定哪种编程接口适合:
- 要用 Java 编写应用程序吗?JAXP 使用 DOM、SAX 和 JDOM;如果您用 Java 编写代码,那么您应使用 JAXP 将您的代码与各种解析器实现的细节隔离。
- 应用程序将如何部署?如果您的应用程序将要作为 Java applet 部署,那么您会希望使要下载的代码数量最小,别忘了 SAX 解析器比 DOM 解析器小。还要知道使用 JDOM 时,除了 SAX 或 DOM 解析器之外还要求编写少量的代码。
- 一旦解析了 XML 文档,还需要多次访问那些数据吗?如果您需要回过头来访问 XML 文件的已解析版本,DOM 可能是正确的选择。而 SAX 事件被触发时,如果您以后需要它,则由您(开发人员)自己决定以某种方式保存它。如果您需要访问不曾保存的事件,则必须再次解析该文件。而 DOM 自动保存所有的数据。
- 只需要 XML 源文件的少量内容吗?如果您只需要 XML 源文件的少量内容,那么 SAX 可能是正确的选择。SAX 不会为源文件中的每个东西创建对象;您要确定什么是重要的。使用 SAX,您要检查每个事件以了解它是否与您的需要有关,然后相应地处理它。更妙的是,一旦找到您正在寻找的东西,您的代码就会抛出一个异常来完全停止 SAX 解析器。
- 您正在一台内存很少的机器上工作吗?若是的话,不管您可能考虑到的其它因素是什么,SAX 是您的最佳选择。
4.XML标准
XML 规范、XML Schema、 XSL、XSLT 和 XPath 、DOM 、SAX、JDOM 和 JAXP 、链接和引用、安全性、Web 服务
参考资料
XML 标准:下面是本教程中提到的所有 XML 标准的字母顺序列表。
- XSLT,可扩展样式表语言(Extensible Stylesheet Language):w3.org/TR/xslt(结尾没有斜杠符号)