XML学习(三)——XML解析

XML解析

XML解析是基于XML上层应用程序的基础。
XML解析器一方面负责分析XML内部文档数据,建立相应的数据结构或产生特定的事件以表示这些信息;另一方面,还要为上层应用程序提供必要信息,供上层进行XML文档的操作。
XML解析器的性能高低直接决定了上层应用程序的性能,传统的XML解析有两种,在之后会进行介绍。

XML解析流程

XML解析流程
XML学习(三)——XML解析
XML解析时,首先将XML文档转换为字节流然后变为有序的字符流,之后进行词法分析和语法分析,最后反馈给上层应用程序。(词法分析和语法分析的概念可以参考编译原理中的概念,基本一致)


XML解析方式
根据解析时是否进行对XML文档的提取分为提取式和非提取式,其中非提取式又可以分为基于DOM和基于流的解析方式
XML学习(三)——XML解析
这里主要描述提取式的两种解析方式


基于XML DOM的解析
XML DOM定义了一套XML文档进行访问、添加、修改、删除的标准接口和方法,所有DOM解析器都基于这套方法。XML DOM将XML文档看作树状的层次节点集合,就像编译原理中的语法分析一样,将XML文档转换为一颗树。
XML学习(三)——XML解析
这颗DOM树符合人类思维习惯,简洁明了。所以基于DOM的解析器都易于使用。解析完成后,DOM解析器会把XML文档存储在内存中,这样上层应用就可以通过文档树方便访问各个节点,DOM解析器支持XPath和随机访问。但是DOM解析器的缺点也很明显:DOM解析器会为每个节点创建节点对象,其中有大量的内存分配和回收操作,性能大大损耗。一般会消耗XML文档5~10倍的内存消耗。


基于XML DOM的解析
基于流的XML解析分为两种:SAX(Simple API for XML)和StAX(Streaming API for XML)。二者均通过事件产生和相应来解析XML文档,但实现原理却不同。

SAX是“推”模式,上层应用定义好回调函数供解析器使用,解析器在解析过程中碰到某种类型结点后就调用回调函数,通知应用程序。这个模型的核心就是解析器,SAX解析器主动解析并产生事件,应用程序只是等待接受即可。
XML学习(三)——XML解析
StAX是“拉”模式,在该模型中,应用程序起主导作用,应用程序通知解析器解析某种节点,并将得到的结果返回上层,而至于什么时候解析,解析什么都有上层决定,StAX只是被动等待调用。
XML学习(三)——XML解析
相较于DOM解析,可以发现流解析不像DOM解析那样分为两个阶段:解析–》访问。而是交替进行,这意味着StAX的延时更低,时间空间浪费更少。但是相应的,由于没有保存整个文档到内存中,流解析并不支持随机访问和XPath操作。

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。