位置:海鸟网 > IT > XML >

XML入门教程:分析XML

分析XML文档可通过程序来做,分析器有两大类,一种是事件驱动的,一种是基于树模型的。

  • 使用事件驱动的分析器时,每遇到一个元素就会触发一个事件,由事件处理器进行处理。事件分析器按顺序读取XML文档,而不把整个文档读入内存,所以处理速度很快。但缺点是由于要从头到尾读取XML文档,因此无法在XML文档中移动位置。事件驱动分析器适合处理其它地方使用的XML数据,如转换成HTML文档或从文件中读取数据并插入数据库中。它的优点有:

  • 文件搜索,从XML文档中搜索需要的标志或数据;

  • 格式转换,如转换成HTML。任何需将原始XML转换成另一种格式的工作都最好使用事件驱动分析器来完成,因为它可动态将信息转换成新格式。

  • 少量修改,你可用事件驱动分析器读取和重新生成XML。在分析过程中,可以改变少量的单语、字符数据内容或重新构造XML。事件驱动分析器特别适合整理和重新格式化XML文档。

  • 简单验证,由于整个文档不在内存中,所以无法进行完整验证,但可检查拼写错误和一般良构XML文档之类的简单问题;

  • 建立内部结构,可以使用事件驱动分析器建立XML文档的复杂内部表示,如基于树的接口使用的树式结构。

  •    

    事件驱动分析器不能在XML文档间交叉引用文档内容,但它使用简单,速度快。

  • 基于树的分析器把整个XML文档读入内存,并生成树状结构。分析器可随机访问树中的任意节点,并能修改树结构和内容。

  • 1. 分析器工具

    现有的分析器种类有上百种,但常用的是两个标准的工具库,一个是XML简单API(SAX,Simple API for XML)和文档对象模型(DOC,Document Object Model)。SAX是事件驱动分析器的标准,而DOM是基于树的分析器标准。另外,Expat虽然不是标准,但它是脚本语言中处理XML时最常用的分析器。Expat由James Clark编写,是事件驱动分析器。

    2. Unicode

    计算机并不能正真理解文本内容,它无法识别诸如a,b,c这类的字母,更不用说中文了。计算机所能理解的只有数字,如60,80等。字符集(character set)规定了字母到数字的映射关系,如65代表大写字母A。65称为码点(code point),字符编码(character encoding)决定码点如何用字节表示。是用多了节还是单字节,高字节位表示什么,低字节位表示什么。

    不同国家使用不同的语言,不同程序使用不同的编码规范,在进行世界范围内的数据交换就要统一表示数据的字符编码规范。传统的ASCII字符集只定义了127个字符,其中前31个是控制符。127位之后的字符随平台不同而不同。大多数平台只能表示前127位,单字节(8位),使得字符集中最多只能提供256个字符。这些标准字符称为罗马或拉丁字符集,用ASCII来表示中文、日文是远远不够的。

    为了解决字符集问题,出现了Unicode字符集。它可用多字节格式编码字符,目前标准允许2字节字符,支持65536个不同字符。标准的Unicode字符集为Latin-1(或ISO-8859-1)。有关Unicode的介绍可访问Unicode的官方网站:

    Unicode字符集为字符分配码点,即编号。这些编号可以用多种模式编码,如UCS-2、UCS-4、UTF-8、UTF-16。

  • UCS-2,也叫ISO-10646-UCS-2。每个字符用一个0~65535之间的两个字节的无符号整数表示。如A的Unicode码点为65,用两个字节00和41(十六进制)表示。B的Unicode码点为66,用两个字节00和42表示。UCS-2有两种形式:高字节(#x0041)在前和低字节(#x4100)在前。为区发高低位不同表示形式,采用UCS-2编码文档通常以Unicode字符#xFEFF(零宽度无间断空格)开头,一般称为字节顺序标记(byte order mark)。这个字符是不可见的。如果两个字节交换位置,得到的字符#xFFFE实际是不存在的。因此中通过查看UCS-2文档的前两个字符是#xFEFF还是#xFFFE,就可确定该文档是否是高字节在前。UCS-2的缺点:如果文本字符主要是拉丁文,由于采用两个字节,字符集编码是单字节字符编码的两倍;UCS-2不能与ASCII向前或向后兼容,用于单字节字符集的工具常常不适用于处理UCS-2编码文件。

  • UTF-8是一种可这长度的Unicode编码。0~127为ASCII码字符集,与ASCII编码完全兼容,每个字符采用一个字节编码。UTF-8用两个字节表示128~2047,该范围覆盖了最常见的非表意字母。其余的字符,主要来自汉语、日语和韩语,每个都用3个字节表示。如果Unicode的码点超过65535个字符,那么这些字符就会用4个字节编码。对于以拉丁文为主的文件,使用UTF-8比UCS-2可减少一半的文件大小。对于汉语、日语和韩语的文件,其大小会增加百分之五十。对于其它语言,文件大小相差不大。UTF-8是最常用的Unicode编码方式。

  • 在Unicode流行以前,出现了一系列处理特定语言的单字节字符集,ISO将14种这样的字符集标准化成ISO 8859标准,分别是ISO-8859-1~14。ISO-8859-15是ISO-8859-1的修订版本。这些字符集统称ISO字符集。

    Cp1252是依赖于Windows平台的一种编码,是Windows的缺省字符集。该种编码不支持跨平台特性,尽量不要使用。

    MacRoman是Mac OS使用的一种非标准、单字节编码。在非Mac平台下使用也会有问题,尽量不要使用。

    在XML文档中,如果需输入编辑器不支持的字符,我们可用字符引用的方式,以十进制或十六进制给出它所代表的Unicode字符编号,如њ(十进制)或者њ(十六进制)。字符引用可用于元素内容、属性和注释,不能用于元素名和属性名、处理指令或XML关键字。如果有一些字符需经常使用,则我们可为这些字符定义实体,这样,在文档中就可方便地引用该实体了。专门定义字符实体的DTD我们可独立出来,形成以.ent为后缀的外部DTD。在需要时使用外部参数实体引用将这些定义引入文档的DTD中。

    XHTML 1.0 DTD包含有三个有用的字符引用实体可在文档中使用。

  • Latin-1字符,

    ISO-8859-1中自160以上的非ASCII码字符。

  • 特殊字符,

    ISO-8859-2中不在Latin-1中的字母。

  • 标点符号,

    希腊字母表(不包含带重音的字符)和各种标点符号、数学运算符及其他数学中常用的符号。

  • 在XML文档中可以使用xml:lang属性规定元素内容采用的语言。这样就可在一篇文档中同时使用多种语言,这是XML跨平台和跨语言的重要特性之一。如:xml:lang="CN-CHN"。语言代码是一个两个字母的语言代码,语言代码后还可跟一个子代码,语言代码可在这里找到。下面是xml:lang属性声明的示例:

    <!ELEMENT test (#PCDATA)><!ATTLIST test xml:lang NMTOKEN #IMPLIED>

    由于所有语言代码都是有效的XML名称标记,所以使用NMTOKEN类型。