XML文件解析技术总结(一)
在开发CSPM建模工具时很自然的要用到XML文件的解析技术。现在我们就总结一下在这方面的学习所得。
XML简介
XML的是eXtensible Market Language(即可扩展的标记语言)的缩写,它是标准通用标记语言(Standard Generalized Markup Language, SGML)的一个子集。
SGML功能非常的强大,它是可以定义标记语言的元语言。而由于它的复杂,不适合于应用。于是W 3C 组织在1996年开始设计一种可扩展的标记语言,从而将SGML的丰富功能与HTML的易用性结合在Web应用中,于是就有了XML。XML它是一种开放的、自我描述的方式定义了数据结构。在描述数据内容的同时能突出对结构的描述,从而体现出数据与数据之间的关系。
大家可能比较熟悉HTML。但与HTML相比,XML有下列优点:
l XML将数据和显示分开
HTML文档将数据、页面的排版、以及页面的表现形式混合在一起,如果要增加新的数据,相应地就要调整数据排版与显示方式。这样不利于数据的交换以及数据的操作,例如插入数据和删除数据。随着电子商务等网络应用的普及,不同系统、不同平台的信息交换日益频繁,而HTML本身的不足,限制了它在Web开发中的应用。
XML只描述数据和数据的结构。从而将数据和显示分开,我们就可以为同一份数据设计不同的排版和显示风格,而数据本身不做任何的改变。
l XML对文档的格式要求更加严格
由于HTML文档格式的松散,导致了HTML文档解析的复杂性,当然也造成了浏览器的兼容的问题。
而XML文档对格式有非常严格的要求,凡是符合标准的文档就是格式良好的XML文档(Well-Formed XML Document)。
l XML有且只能有一个根元素
这减少了在解析文档时的难度。
对XML文档的解析
在解析XML文档时通常是利用XML解析器对文档进行分析,而应用程序就是通过解析器提供的API而得到XML数据。
如果不同的开发商开发的XML解析器提供的API都不一样,那么应用程序只能使用一个特定的解析器。一旦更改解析器,就要重新更改代码,这是相当痛苦的。所以目前几乎所有的解析器都对两套标准的API提供了支持,它们就是DOM和SAX(标准的威力啊)。
DOM和SAX只是定义了一套标准的接口,以及一些默认的实现。而解析器的开发商在开发解析器的时候就要实现这些接口。用户只要根据这些接口就能访问XML文档,却不必去知道具体的实现(这就是面向对象编程思想中的:针对接口编程,而不是对类编程)。
Apache的Xerces是一个使用非常广泛的解析器。它都支持DOM和SAX,并提供了相应的接口。它更是提供了多种语言的实现版本。
....
org.xml.sax.XMLReader sp = new org.apache.xerce.parsers.SAXParser();
FileInputStream fis = new FileInputStream("some.xml");
InputSource is = new InputSource(fis);
sp.setContentHandler();
sp.parse(is);
....
要利用Xerces访问XML文档,只需在应用程序中构造一个解析器的实现类的对象。例如:SAX定义的解析器接口是org.xml.sax.XMLReader,Xerces中提供的实现类是org.apache.xerces.parsers.SAXParser。
但是现在仍有问题:不同的解析器实现类是不同的,如果要使用另一个解析器,仍然需要修改程序,比如说就得修改org.apache.xerce.parsers.SAXParser( )这段代码。而JAXP API可以帮助我们在改动解析器时无需改动代码。JAXP提供了在解析器之上一个抽象层,并未提供任何解析XML的方法和实现。从而屏蔽了具体开发商的实现,允许开发人员以独立于厂商的API调用访问XML数据。
从 JAXP 1.1 开始, JAXP 就成为了 J2SE 和 J2EE 的一部分。 JAXP 开发包有 javax.xml 包及其子包、 org.xml.sax 包及其子包、 org.w 3c .dom 及其子包组成。在 javax.xml.parsers 包中,定义了几个工厂类,用于加载 DOM 和 SAX 的实现类。只要符合 JAXP 规范的解析器实现其中的接口和抽象类,开发人员就可以在不改动代码的前提下,任意切换底层的实现类。