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