《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.3 验证XML文档

3.3 验证XML文档

在前一节中,我们了解了如何遍历DOM文档的树形结构。然而,如果仅仅按照这种方法来操作,会发现需要大量冗长的编程和错误检查工作。你不但需要处理元素间的空白字符,还要检查该文档包含的节点是否和你期望的一样。例如,当你在读入下面这个元素时:
《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.3 验证XML文档

你将首先得到第一个子节点,这是一个含有空白字符“n”的文本节点。你跳过文本节点找到第一个元素节点。然后,你要检查它的标签名是不是“name”,还要检查它是否有一个Text类型的子节点。接下来,转到下一个非空白字符的子节点,并进行同样的检查。那么,当文档作者改变了子元素的顺序或是加入另一个子元素时又会怎样呢?要是对所有的错误检查都进行编码,就会显得太琐碎麻烦了,而跳过这些检查又显得不慎重。
幸好,XML解析器的一个很大的好处就是它能自动校验某个文档是否具有正确的结构。这样,解析就变得简单多了。例如,如果知道font片段已经通过了验证,那么你不用进一步检查就能得到其两个孙节点,并把它们转换成Text节点,得到它们的文本数据。
如果要指定文档结构,可以提供一个文档类型定义(DTD)或一个XML Schema定义。DTD或schema包含了用于解释文档应如何构成的规则,这些规则指定了每个元素的合法子元素和属性。例如,某个DTD可能含有一项规则:
《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.3 验证XML文档

这项规则表示,一个font元素必须总是有两个子元素,分别是name和size。将同样的约束用XML Schema表示如下:
《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.3 验证XML文档

与DTD相比,XML Schema可以表达更加复杂的验证条件(比如size元素必须包含一个整数)。与DTD语法不同,XML Schema自身使用的就是XML,这为处理Schema文件带来了方便。
在下一节中,我们将详细讨论DTD。接着简要介绍XML Schema的一些基础知识。最后,我们会展示一个完整的应用程序来演示验证是如何简化XML编程的。

上一篇:Mozilla 宣布火狐浏览器停止支持 OS X 10.6/10.7/10.8


下一篇:《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.7.2 不适合使用Optional值的方式