2014-04-08 54 views
0

我有一个非常大的XML,我收到作为输入。从这个XML我只需要一个子元素。解析整个XML只检索一个元素似乎是一种性能矫枉过正。有没有更好的方法来解决这个问题?XML分析:解析整个XML的一个字段

一种方法是使用DocumentBuilder API分析XML,然后使用XPath检索所需的字段。但解析方法仍然会不必要地解析整个xml。在解析器的任何实现中,是否存在一个重载的解析方法,该解析器接受xpath并仅根据XPath解析XML。

+0

考虑使用STAX。 http://stackoverflow.com/questions/7215931/reading-huge-xml-file-using-stax-and-xpath –

回答

1

你需要的是一个SAX解析器或类似的快速解析器。 SAX解析器不分析整个XML,他们只是解析xml直到找到他们正在寻找的元素。

您可以在wikipedia's link中阅读关于SAX解析器的内容。也看看the java docs for SAX parser

1

虽然没有办法解决您的XML数据的正确处理方法,但确实有办法在整个文档中构建内存中表示。 Java提供SAX解析,这是基于事件的。您可以实现XML事件的事件处理程序,忽略所需内容的所有内容,并在检索到要查找的部分后停止。

这里是tutorial from Oracle showing how to use SAX APIs to retrieve counts of individual tags without building a document in memory

由于most XPath processors work with SAX as well,您可能会将事件提供给XPath处理器,并以此方式查找所需的标记。但是,当您需要获取单个元素时,这可能是一种矫枉过正的情况。

0

XPath operates over the document object model.所以你必须有一个DOM来评估一个XPath表达式。否则,它会验证什么?

因此,如果您不想解析文档,那么XPath就不存在了。您的其他选项是快速SAX解析,您可以忽略所有SAX解析事件,直到找到所需的元素,提取所需的文本,然后放弃解析过程的其余部分。

另一种选择是去简单的方法:用grep.