您推荐哪种Java XML库(以替代dom4j)?[关闭]


76

我正在寻找类似dom4j的东西,但没有dom4j的缺陷,例如不良或缺少文档以及看似停滞的开发状态。

背景:我一直在使用 倡导dom4j,但是对此感觉并不完全正确,因为我知道该库远非最佳选择(示例:查看如何记录与XSLT相关的Stylesheet类中的方法;运行该传递什么( )作为String mode参数?

要求:与使用 纯JDKjavax.xmlorg.w3c.dom软件包)相比,该库应该使基本XML处理更加容易。这样的事情:

  • 将XML文档(从文件或字符串)读取到对象中,轻松地遍历和操作DOM,执行XPath查询并对其运行XSLT。
  • 用Java代码构建XML文档,添加元素,属性和数据,最后将文档写入文件或字符串。

我真的很喜欢dom4j所承诺的:“易于使用的开放源代码库,用于XML,XPath和XSLT,并完全支持DOM,SAX和JAXP。 ”即将推出的dom4j 2.0确实声称可以修复所有问题:充分利用Java 5并添加缺少的文档。但不幸的是,如果您仔细观察

警告:dom4j 2.0处于预Alpha阶段。很有可能无法编译。如果可以随机编译,则可能无法运行。万一它偶尔运行,它可能会突然爆炸。如果要使用dom4j,则需要版本1.6.1。真。

...网站已经说了长时间。那么,有没有dom4j的好选择?请为您的首选库提供一些理由,而不仅仅是转储名称和链接。:-)


6
看来他们已经失去了dom4j.org域(也许另一个迹象表明确实应该用某些东西代替它……)–该网站仍然可以在dom4j.sourceforge.net上找到
约尼克,

2
查看有关该主题的更多文章:stackoverflow.com/questions/373833/best-xml-parser-for-javastackoverflow.com/questions/25614/…。关于jdom / dom4j / xom的很好的注释也位于这里:lists.xml.org/archives/xml-dev/200410/msg00492.html
dma_k 2010年

哦,刚刚注意到最终有一个dom4j 2.0 alpha发布:sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2(尽管它们仍然没有恢复其dom4j.org域。)任何人都尝试过出来吗?
约尼克

@ vtd-xml。不,我没有听说过...如果您认为它是一个很好的dom4j替代品,请考虑发布完整的答案
Jonik 2010年

另一个选择是,您可以随时帮助dom4j团队制作出更好的dom4j。抓住叉子,潜入并提交一些补丁。
亚当·根特

Answers:


53

好的,XOM :-)

XOM旨在易于学习和使用。它非常简单直接地工作,并且学习曲线很浅。假设您已经熟悉XML,那么您应该能够非常快速地启动并运行XOM。

我使用XOM已经有几年了,但我仍然非常喜欢它。易于使用,网络上有大量文档和文章,API在各个发行版之间没有变化。1.2是最近发布的。

XOM是唯一不影响正确性的XML API。XOM仅接受名称空间格式正确的XML文档,并且仅允许您创建名称空间格式正确的XML文档。(实际上,它比这要严格一些:它实际上保证所有文档都是可双向访问的,并且具有定义明确的XML信息集。)XOM管理您的XML,因此您不必这样做。使用XOM,您可以专注于应用程序的独特价值,并信任XOM来正确使用XML。

查阅网页http://www.xom.nu/以获得常见问题解答,食谱,设计原理等信息。

作者还撰写了有关XML API的问题(以及如何修复它们)的文章。(基本上,首先考虑XOM的原因)

这里也是5部分Artima采访约XOM,这里只讲作者有什么不对的XML API好的,坏的,和DOMJDOM的设计审查教训JDOM教训,最终设计原则和XOM


XOM确实看起来很有希望,特别是考虑到其创建者如何非常清楚地了解现有库,并尝试对其进行改进。与dom4j和JDOM相比,它似乎更加活跃:最新版本是2009年3月(尽管之前的版本是2006年8月)。我正在尝试其中的XOM,看看我是否真的可以像dom4j一样或更轻松地使用它。
约尼克,

好吧,我一直在测试XOM(利用堆栈溢出来提供不错的小问题解决:stackoverflow.com/questions/883987/...stackoverflow.com/questions/428073/...stackoverflow.com/questions/139076/ …等等:-),我开始确信我可以使用dom4j进行XOM的几乎所有操作!
约尼克,

(续)但是,我怀疑的一件事是流XML数据,这是我之前使用dom4j完成的。这是我写的一个问题,也许您知道答案?stackoverflow.com/questions/967288/...
Jonik

11
谨防。将dom4j / jdom转换为XOM是一件痛苦的事情。此外,API不支持Java集合。两者都是很痛的地方。
吉利2010年

4
只是在与XOM一起工作后补充我的意见。绝对比JDOM好。但它缺乏某些糖的功能,我想在XML API(见Element.setAttribute(name, value)Element.setText(string),访问者模式(见lists.ibiblio.org/pipermail/xom-interest/2010-March/004076.html),更好的StAX / TrAX的API支持),而dom4j具有。
dma_k 2010年

18

JDK中内置的一个...还有一些附加功能。

是的,使用起来很痛苦:它是根据委员会明确设计的W3C规范建模的。但是,它在任何地方都可用,如果您选择了它,就不会遇到来自第三方库的“我喜欢Dom4J”,“我喜欢JDOM”,“我喜欢StringBuffer”参数。特别是因为使用不同的库,这样的参数可以变成不同的代码...

但是,正如我所说,我确实做了一些增强:实用XML库是实用程序类的集合,这些实用程序类使使用DOM更加容易。除了XPath包装器,这里没有什么复杂的,只有一堆我发现自己为每项工作都重写的例程。


2
我同意。我曾经向JDom发誓,但是发现一旦我编写了一些辅助方法,JAX-P的东西就不再困难了,它已经安装到了所有地方。
Dave Ray

1
JAXB也是内置的,非常不错。
亚当·根特

10

我一直在使用XMLTool替换Dom4j,并且运行良好。

XML工具使用Fluent接口模式来促进XML操作:

XMLTag tag = XMLDoc.newDocument(false)
   .addDefaultNamespace("http://www.w3.org/2002/06/xhtml2/")
   .addNamespace("wicket", "http://wicket.sourceforge.net/wicket-1.0")
   .addRoot("html")
   .addTag("wicket:border")
   .gotoRoot().addTag("head")
   .addNamespace("other", "http://other-ns.com")
   .gotoRoot().addTag("other:foo");
System.out.println(tag.toString());

它是为Java 5设计的,很容易在所选元素上创建可迭代的对象:

for (XMLTag xmlTag : tag.getChilds()) {
   System.out.println(xmlTag.getCurrentTagName());
}

这看起来真是太神奇了,正是我需要支持一些数据驱动的测试。
FDM

6

我一直很喜欢jdom。它被编写为比DOM解析更直观(无论如何,SAX解析总是显得笨拙)。

从任务说明中:

Java API并没有令人信服的理由来操纵XML变得复杂,棘手,不直观或令人头疼。JDOMTM是以Java为中心和Java优化的。它的行为类似于Java,它使用Java集合,对于当前的Java开发人员来说是完全自然的API,并且为使用XML提供了一个低成本的入口点。

这几乎就是我的经验-节点树的相当直观的导航。


凉。你读完我问题的最后一句话吗?;-)
约尼克(Jonik),2009年

+1-比所有W3C东西简单。
duffymo,2009年

2
我最近在一个项目上使用了JDOM,尽管API直观,但我有两个问题:开发似乎停滞了(最近一次更新是在2007年末),并且该库尚未被泛化。
cdmckay,2009年

1
如果选择JDOM与XOM,则选择XOM。
dma_k 2010年

3
看起来JDOM 2.0.0刚刚发布:“ 2.0.0将JDOM引入了泛型和Java 5引入的其他Java语言项目的世界。”
Jonik

5

我使用XStream,它是一个简单的库,用于将对象序列化为XML并再次返回。

它可以由注释驱动(例如JAXB),但是它具有非常简单易用的api,甚至可以生成JSON。


似乎很简单。只是想知道它实际上是如何工作的:如果我从互联网上下载了XML,XStream如何知道应将其反序列化到哪个类?
埃托雷

@ettore号 您应该使用JAXB之类的东西,因为它了解架构和WSDL。
亚当·根特

1
并不是像dom4j这样的通用XML API的替代品。它只是一个序列化器/解串器,不是吗?
zehrer 2011年

3

我将通过说为什么不使用JAXB来添加@kdgregory的内置答案。

它带有一些注释,可以轻松地为大多数XML文档建模。我的意思是您可能要解析这些内容并放入一个对象中,对吗?

JAXB 2.0内置于JDK 1.6中,与许多其他内置的javax库不同,此库相当不错(Kohusuke对其进行了开发,因此您知道它的好处)。


我想知道在简化和避免样板方面,JAXB 2.0如何与轻量级的基于注释的XML库(如Simple)进行比较?(在我问这个问题的那天,我完全错过了JAXB,但是如果有人需要用Java来做XML,我想应该仔细看看。)
Jonik 2015年

3

在最近的项目中,我不得不进行一些XML解析,最后使用了同事推荐的Simple Framework

最后我对此很满意。它使用基于注释的方法将XML元素和属性映射到Java类和字段。

<example>
  <a>
    <b>
      <x>foo</x>
    </b>
    <b>
      <y>bar</y>
    </b>
  </a>
</example>

对应的Java代码:

@Root
public class Example {

   @Path("a/b[1]")
   @Element
   private String x;

   @Path("a/b[2]")
   @Element
   private String y;
}

与dom4j或XOM完全不同。您可以避免编写愚蠢的,模样化的XML处理代码,但是起初,您可能会把头撞在墙上一会儿,以尝试正确地处理批注。

(是我4年前问这个问题的。虽然XOM似乎是不错的,相当流行的dom4j替代品,但我还没有完全接受它。奇怪的是,这里没有人提到Simple Framework。我决定解决这个问题,因为我可能会再次使用它。)


1

在我们的项目中,我们使用http://www.castor.org/,但仅用于小型XML文件。它真的很容易学习,只需要一个映射XML文件(如果XML标记与类属性完全匹配就不需要),并且已经完成。它支持侦听器(如回调)来执行其他处理。缺点:它不是像JAXB这样的Java EE标准。


Castor确实支持JAXB。您可以选择使用映射文件,也可以使用XML模式和Castor的代码生成器。
艾迪(Eddie)

我不知道,谢谢你的信息!
Lluis Martinez,2009年


0

有时我使用Jericho,它主要是HTML解析器,但是可以解析任何类似XML的结构。

当然,它仅用于最简单的XML操作,例如查找具有给定名称的标签,遍历结构,替换标签及其属性,但这不是大多数用例吗?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.