快速有效的解析大型XML文件

时间:2022-06-04 07:15:20

              和老师做研究也快一年了。使我认识比较深的是对XML的解析和图论。由于我们做的试验是通过XML来生成图,于是摆在我们面前的首要问题是如何解析XML。

              在此之前曾经用过DOM4J来解析过XML,那是在给研究生的学姐作业Webservice的时候用的,用来解析wsdl文件,来实现简单的动态的服务调用。那个wsdl最多也就几兆,大部分可以将内容放在内存中。而现在解析的最小的XML文件都有100M,用那种比较简单的解析方式是无法快速解析的。我们知道JAVA解析xml有以下几种方法:jdom、dom4j、dom、sax。还有一种是自己写一个解析器!这个我也写过,能够解析一般的XML文件,可是通用性不是很好就没做太多的研究。我们知道前面两种都是比较好用的,如jdom,dom4j可以使用xpath规则的语言来读取xml中指定的内容。但是它们都是和dom一样,都是将整个xml文件读入内容中在对xml进行解析,这样的解析方式对与大型的xml是不合适的。因为受到内存的限制。

               那么怎么解析大型的xml数据呢?我想大家看到现在也应该知道是那个,就是sax。sax解析xml它是以流的形式将xml内容读入内存中,我们使用sax解析xml是可以继承DefaultHandler类,也可以实现相应的接口,对其中的五个方法进行重写,分别是:

1、public void startDocument() //该方法是解析xml的入口,即开始对XML解析 2、public void startElement(String uri, String localName, String qName,Attributes attributes)//这是对xml一个element进行解析,如:<element attribute='value'>text</element>
 其中两个参数是最常用的,一个就是attributes和qName,此处的attributes是一个集合,可以将多个属性封装在其中,
可以通过attributes.getValue(0)来获得此处的attribute的value,而qName是此处的element,也就是元素名
3、public void characters(char[] ch, int start, int length)//该方法是获得元素间的text文本内容,可以通过new String(ch, start, length);来获得,
 4、public void endElement(String uri, String localName, String qName)//此处是一个元素的结束方法,如此处的</element>时则调用该方法
5、public void endDocument() //该方法是在解析完xml文件后调用该方法


有上面可以看出sax解析xml是更具xml内容的组成结构来进行解析的,每个方法代表的是xml结构中的一个成分,所以可以灵活的运用,来对xml进行解析。通过试验表明sax解析200m的XML文件只需几十秒的时间(是在我的个人电脑上)。

                希望这篇文章能给初次借出对大型XML文件进行解析的人带来一定的帮助,从而避免我的弯路。谢谢阅读本文......