Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java最佳XML解析器_Java_Xml_Parsing - Fatal编程技术网

Java最佳XML解析器

Java最佳XML解析器,java,xml,parsing,Java,Xml,Parsing,我需要读取少量(最多几MB,UTF-8编码)XML文件,四处搜索各种元素和属性,也许修改一些,然后将XML重新写回磁盘(最好是使用良好的缩进格式) 什么样的XML解析器最适合我的需要?有很多选择。我知道的一些是: 当然还有JDK中的一个(我使用的是Java6)。我对Xerces很熟悉,但觉得它很笨重 建议?我发现dom4j是处理XML的工具。特别是与XECES.相比,我认为你不应该考虑任何特定的解析器实现。允许您以标准方式使用任何符合标准的解析器实现。代码应该更具可移植性,当您

我需要读取少量(最多几MB,UTF-8编码)XML文件,四处搜索各种元素和属性,也许修改一些,然后将XML重新写回磁盘(最好是使用良好的缩进格式)

什么样的XML解析器最适合我的需要?有很多选择。我知道的一些是:

当然还有JDK中的一个(我使用的是Java6)。我对Xerces很熟悉,但觉得它很笨重


建议?

我发现dom4j是处理XML的工具。特别是与XECES.

相比,我认为你不应该考虑任何特定的解析器实现。允许您以标准方式使用任何符合标准的解析器实现。代码应该更具可移植性,当您意识到某个特定的解析器已经太旧时,您可以用另一个解析器替换它,而无需更改代码行(如果您做得正确的话)

基本上有三种以标准方式处理XML的方法:

  • 这是最简单的API。通过定义一个处理程序类来读取XML,该处理程序类在以串行方式处理XML时接收元素/属性中的数据。如果您只计划读取一些属性/元素和/或写回一些值(您的案例),则会更快、更简单
  • 此方法创建一个对象树,允许您随机修改/访问它,以便更好地进行复杂的XML操作和处理
  • 这是在萨克斯和DOM之间的路径中间。您只需编写代码,以便在处理数据时从感兴趣的解析器中提取数据
忘记诸如JDOM或Apache之类的专有API(例如),因为它会将您绑定到一个特定的实现,该实现可能会随着时间的推移而演变,或者会失去向后兼容性,这将使您在将来需要升级到新版本的JDOM或任何您使用的解析器时更改代码。如果您坚持使用Java标准API(使用工厂和接口),您的代码将更加模块化和可维护


没有必要说所有(我没有检查所有,但我几乎肯定)提出的解析器都符合JAXP实现,因此从技术上讲,无论使用哪种解析器,您都可以使用所有解析器。

如果速度和内存没有问题,dom4j是一个非常好的选择。如果您需要速度,使用像Woodstox这样的StAX解析器是正确的方法,但是您必须编写更多的代码来完成任务,并且必须习惯于在流中处理XML。

除了SAX和DOM之外,还可以使用XMLStreamReader(一种XML拉式解析器)进行StAX解析。

如果您不太关心性能,我是Apache Digester的忠实粉丝,因为它本质上允许您直接从XML映射到Java bean


否则,您必须首先解析对象,然后构造对象

我不建议这样做,因为你的应用程序中有很多“思考”,但使用XSLT可能比Java操作更好(而且可能更快,XSLT到字节码编译)。

这里是对DOM、SAX、StAX和TrAX的一个很好的比较 (来源:)

功能StAX SAX DOM TrAX

API类型拉式、流式推式、内存树中的流式XSLT规则

易用性中等

XPath功能否是

CPU和内存性能各不相同

仅向前是是否

阅读XML

编写XML是否是


CRUD否否

简单XML非常容易(反)序列化对象。

我不需要制作Java Bean,只需稍微操作原始XML元素,并查看某些元素以从中获取数据,因此DOM样式的解析器可能是我的理想解决方案。是的,dom4j可能是更好的解决方案。。。我过去经常大量使用它,直到我升级到digesterBetter,可能:更快,非常不可能。读取、操作和编写XML正是XSLT设计的目的。这是一个很好的开箱即用的答案。实际上,有三种方式:StAX(javax.xml.stream)是第三种标准方式。(我个人喜欢SAX)@kitokid Chrome告诉我页面上有令人讨厌的东西。我用这个来代替:好的概述:只有一件事我不同意——虽然对于增量/流,SAX和Stax是好的,标准API就足够了,但对于DOM来说,情况并非如此(IMO):对于像XOM、JDOM和DOM4J这样特定于Java的Take,有充分的理由:语言无关的DOM使用起来相当麻烦。DOM4J非常好,但肯定不是没有问题。对于好的dom4j替代方案,请参见@zehrer他们是线程安全的吗?我认为,您可以在这里找到更多的玩家:我认为这个问题存在真正的问题。1是比较完全不同的东西,将解析器(xerces、crimson)与dom操作库(dom4j、xom、jdom)结合起来。此外,答案倾向于倡导,没有那么建设性。+220,也没有建设性。显然,版主和用户对什么是建设性的有不同的看法。是的,当涉及到这样的问题时,mods似乎是短视的。是的,答案是自以为是的,但肯定是基于经验的,而且大多数时候答案都是量化的。Mods可能需要创建一个不同的标记来移动这些问题,这些问题将开放供讨论,从而导致建设性的批评和输出。@dma_k您的链接不起作用。您可以使用SAX编写XML。接收器提供了一个处理程序实现,用户可以调用SAX事件来生成XML输出。(我看到该表是来源而非原始材料,但该表是错误的)