【问题标题】:What xml parser should I use?我应该使用什么 xml 解析器?
【发布时间】:2010-01-04 20:21:44
【问题描述】:

我有一个有点大的文件(~500KiB),里面有很多小元素(~3000)。我想从中挑选一个元素并将其解析为 java 类。

属性 简体

<xml>     
<attributes>
  <attribute>
     <id>4</id>
     <name>Test</id>
  </attribute>

  <attribute>
     <id>5</id>
     <name>Test2</name>
  </attribute>

<!--3000 more go here-->
</attributes>

简化

public class Attribute{
  private int id;
  private String name;

  //Mutators and accessors

}

我有点喜欢 XPath,但人们建议使用 Stax 甚至 VDT-XML。我应该怎么办。

【问题讨论】:

  • 你有一定的性能需求吗?一些 XML 解析器会抓取,而另一些则对这种事情很快。
  • 好吧,我必须一次选择一个元素。性能并不是一个真正的大问题。但总是要考虑一些事情。你说其他人对这种事情很快。你有这方面的例子吗?
  • 您如何确定您需要检索的内容?能给我们举个例子吗?
  • 好的,但是如果我可以使用更快的使用模式的解析器,添加模式不是问题。

标签: java xml xpath parsing


【解决方案1】:

500 kb 并不是那么大。如果你喜欢 XPath,那就去吧。

【讨论】:

  • 好的,谢谢^^,但这只是个人喜好。我想知道还有哪些其他选择可以使用。对于这种情况,最好的解析器是什么。
【解决方案2】:

我有点喜欢 XPath,但人们建议使用 Stax 甚至 VDT-XML。我该怎么办。

DOM、SAX 和 VTD-XML 都是解析 XML 文档的三种不同方式。大致按照内存效率的顺序排列。 DOM 需要比 XML 文件大 5 倍以上的内存。 SAX 只是效率更高一点,VTD-XML 仅比 XML 大文件多使用一点内存,大约是 1.2 倍。

XPath 只是一种从(已解析的)XML 文档中选择元素和/或数据的方法。

换句话说,您可以将 XPath 与任何 XML 解析器结合使用。所以这毕竟是无关紧要的。如果您只是想获得最佳的内存效率和性能,请选择 VTD-XML。

【讨论】:

  • 从技术上讲,SAX 在解析器中的开销很小。这就是代码对其解析的内容所做的事情,这将使用大部分内存。作为证据,如果您的数据处理程序没有实例化任何对象,那么您可以使用 SAX 解析器解析 XML 比可用 RAM 容量大很多倍。
【解决方案3】:

我在上面也发表了评论,因为几乎没有要考虑的选项 - 但根据您最初的描述,我认为您可以在这里使用简单的 SAX 处理器:它可能会运行得更快(尽管它可能不会在映射 Java 类时看起来和其他机制一样漂亮):

这里有一个例子,和你的例子非常吻合:

http://www.informit.com/articles/article.aspx?p=26351&seqNum=6

【讨论】:

  • +1,我也是这样做的。简单且开销低。对于更复杂的事情,XPath 是一个简单的后备方案。
  • 谢谢。我会用这个=)
【解决方案4】:

避免使用 DOM 解析器 - 不需要,尤其是对于大型文件和相对简单的 XML 语法。

要使用哪个具体的,抱歉,我没有使用它们,所以除了查看您的许可、性能和支持(针对问题)之外,我无法为您提供更多指导。

【讨论】:

  • 同意您在这里并不需要 DOM - 您可能可以在 SAX 中实现 [通常更快]。 (尽管使用 DOM 可能会让您更轻松地将数据映射到类 - 但在这种情况下,您不妨全力以赴,并使用“Digester”为您完成工作。(或 XMLBeans - 个人未使用此,所以无法评论))。
【解决方案5】:

我最喜欢的 XML 库是 Dom4j

【讨论】:

  • 我的也是。与 JDK API 相比,它非常平易近人。
【解决方案6】:

每当我必须处理 XML 时,我只使用 XMLBeans。对于您所追求的东西来说,这可能有点矫枉过正,但它让生活变得轻松(一旦您知道如何使用它)。

【讨论】:

  • 谢谢!我阅读了我能找到的前几个例子。我想我会在未来的项目中使用它,但为此它似乎确实有点矫枉过正,因为数据非常简单。我只想检索一种对象。
【解决方案7】:

如果您根本不关心性能,Apache Digester 可能对您有用,因为它会在您定义规则后为您初始化 Java 对象。

【讨论】:

  • 是的,我喜欢用于映射到 Java 类的消化器 - 工作得非常好 - 如果 XML/类随着时间的推移而发展,它很容易扩展。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多