第三章 XML
XML和HTML都是标准通用标记语言SGML的衍生语言。XML有以下特点: 大小写敏感,与 不同。 结束标签不可省略。 若没有结束标签,元素必须以/结尾。 属性值必须用引号括起来。 所有的属性都必须有属性值。
XML应以一个文档头开始,如
或者
文档头之后是文档定义类型DTD,例如
但文档定义类型并不是必须的,最后XML文档的正文包括根元素,根元素包括子元素和文本。对于XML文档,属性只应该用来修改值的解释而不是指定值。
此外,XML文档中还会包括其他元素
字符引用:$#表示十进制值,&#x表示十六进制值。
实体引用:形式是&name;
CDATA部分:用来限定界限。在其中的字符串不必被解释为标记。里面的字符串不能是]]>。
处理指令:指专门在处理XML文档应用程序中使用的指令,用限定其界限。
注释:用限定其界限,注释内不该含有--。
解析器是这样一个程序:它读入一个文件,确定这个文件具有正确的格式,然后将其分解成各种元素。Java库中有两种解析器:
树形解析器:例如文档对象模型DOM解析器,将读入的XML文档转换成树结构。
流机制解析器:例如XML简单API(Simple API for XML, SAX)解析器,读入XML文档时生成对应的事件。
如果要指定文档结构,可以提供一个文档类型定义DTD或一个XML Schema定义。DTD或schema包含了用于解释文档应如何构成的规则,这些规则指定了每个元素的合法子元素和属性。
文档类型必须匹配根元素的名字,位于由[...]限定界限的块中。由于DTD会使得文件长度过长,可以转为SYSTEM声明实现这个目标,其中传入一个包含DTD的URL。
在文档中引用Schema文件时,需要在根元素中添加属性,例如
这个声明说明Schema文件config.xsd会被用来验证该文档。
xsd:sequence结构和DTD中的连接符号等价,xsd:choice和|操作符等价。
解析带有Schema的XML文件有以下几点要求:
必须打开对命名空间的支持。
必须对Schema工厂有以下处理
XML用命名空间来避免名字冲突,名字空间由URI来标识。之所以使用HTTP URL作为命名空间的标识符时因为这样方便确保它们是独一无二的,例如主机部分的唯一性直接由域名系统保证。
主要包括SAX解析器和StAX解析器,前者使用事件回调,后者提供了遍历解析事件的迭代器。
SAX解析器在解析XML输入数据的各个组成部分时会报告事件,但不会以任何方式存储文档,实际上DOM解析器是在SAX解析器的基础上构建的,它在接收到解析器事件时构建DOM树。
XHTML是一种HTML方言,且是良构的XML。
生成XML文档的过程是用文档的内容构建一颗DOM树,然后再写出该树的所有内容。
相比不带命名空间的文档,创建带命名空间的文档有以下步骤。
将生成器工厂设置为命名空间感知。
使用createElementNS而不是createElement来创建所有节点。
XSL转换机制可以指定将XML转换为其他格式的规则。