尝试找出从复杂XML中提取内容的正确方法。使用关键字,我正在尝试使用Xpath进行识别和提取。我需要提取50多个属性,这些属性是从PDF文档生成的XML。 (另存为XML) 现在,我想知道这是不是正确的方法?
我是否应该使用DOM解析器解析XML,然后提取我需要的内容?有什么想法吗?
答案 0 :(得分:0)
最有可能的是,XPath将是最优雅的:
thing = getPathThing(doc, "/path/to/element");
<repeat 50 times>
它可能是最慢的。它只需要做大部分工作。
DOM技术可能会稍快一些。两者都走DOM来找到它们的元素。我确定差异是可测量的,我不确定它是否明显,如果所有XPath表达式都是预编译的。两者都要求整个文档都在内存中。
最快的方法是运行一些流解析器(即SAX),因为你可以在它们飞过时抓取元素。但是,SAX解析器往往看起来很糟糕。我们有其他机制是有原因的,SAX并不是特别优雅。但它很快,而且内存便宜。它的内存成本与您保留的数据有关,而不是XML有效负载的总数据。
如果你能“负担得起”,XPath可能是代码可维护性POV的最佳选择,否则我会忍受并且去SAX。
答案 1 :(得分:0)
首先,不要使用DOM。假设你在Java世界(你实际上没有说),使用一个更现代的树模型,如XOM或JDOM2。它们更容易使用,特别是在使用命名空间时,它们更快,并且它们支持您需要的所有功能。人们使用DOM是因为他们没有意识到有更好的东西。
其次,使用树模型和使用XPath并不是互斥的。我经常构建树,然后混合使用XPath导航和直接导航:例如,使用XPath查找元素,然后使用直接导航访问其属性。 XPath使更复杂的访问路径更容易表达,并且生成的代码更易于维护,但我不会仅使用XPath从元素到其属性之一。
无论您使用何种方法(DOM,SAX,XPath,数据绑定),从XML获取数据都是一件麻烦事。如果你可以避免它,可以用基于XML的语言(如XSLT或XQuery)编写整个应用程序,然后执行。