你推荐什么Java XML库(替换dom4j)?

时间:2009-05-06 21:29:55

标签: java xml dom4j

我正在寻找像dom4j这样的东西,但是没有dom4j的瑕疵,例如文档错误或缺失以及看似停滞的开发状态。

背景:我一直在使用and advocating dom4j,但对此并不完全正确,因为我知道该库远非最佳(例如:查看XSLT中的方法如何相关{记录了{3}}类;作为String mode参数传递给run()的是什么?)

要求: 与Stylesheet usingpure JDKjavax.xml包时相比,库应该使基本的XML处理更容易。这样的事情:

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

我非常喜欢org.w3c.dom,实际上:“易于使用,开源库用于处理XML,XPath和XSLT [...],完全支持DOM,SAX和JAXP。< / em>“即将推出的dom4j 2.0确实声称可以解决所有问题:充分利用Java 5并添加缺少的文档。但不幸的是,如果你dom4j promises

  

警告:dom4j 2.0处于pre-alpha状态   阶段。可能它不可能   编译。如果它可以编译   随机它可能无法运行。   如果它偶尔运行它可以   突然爆发。如果你想使用   dom4j,你想要1.6.1版本。真。

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

11 个答案:

答案 0 :(得分:53)

当然,XOM: - )

  

XOM旨在易于学习   而且易于使用。它很有效   直截了当,并且非常   浅学习曲线。假设   你已经熟悉XML了   应该能够起床和运行   与XOM很快。

我现在使用XOM几年了,我仍然非常喜欢它。易于使用,大量文档和Web上的文章,API在版本之间不会改变。 1.2最近发布了。

  

XOM是唯一没有的XML API   妥协正确性。仅限XOM   接受命名空间格式良好的XML   文件,只允许你   创建命名空间格式良好的XML   文档。 (事实上​​,它有点儿   比那更严格:它实际上   保证所有文件都是   圆形的,有明确的定义   XML信息集。)XOM管理您的XML   你不必。使用XOM,您可以   专注于你的独特价值   应用程序,并信任XOM来获取   XML正确。

查看网页http://www.xom.nu/,了解常见问题解答,食谱,设计原理等。如果只有一切设计都如此热爱: - )

作者还撰写了关于What's Wrong with XML APIs (and how to fix them)的文章。 (基本上,首先存在XOM的原因)

以下是关于XOM的5位Artima访谈,他们谈论了what's wrong with XML APIsThe Good, the Bad, and the DOMA Design Review of JDOMLessons Learned from JDOM以及最后Design Principles and XOM

答案 1 :(得分:17)

The one built into the JDK ...添加了一些内容。

是的,使用起来很痛苦:它是以委员会明确设计的W3C规范为蓝本的。但是,它可以在任何地方使用,如果你坚持下去,你就不会遇到“我喜欢Dom4J”,“我喜欢JDOM”,“我喜欢StringBuffer”这些来自第三方库的论点。特别是因为这些参数可以使用不同的库变成不同的代码片段......

但是,正如我所说,我的确略有增强: Practical XML库是一组实用程序类,可以更轻松地使用DOM 。除了XPath包装器之外,这里没有任何复杂的东西,只是我发现自己为每个工作重写的一堆例程。

答案 2 :(得分:10)

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

XML Tool使用Fluent Interface模式来促进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());
}

答案 3 :(得分:6)

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

来自使命宣言:

  

没有令人信服的理由   用于操纵XML的Java API   复杂,棘手,不直观或者a   颈部疼痛。 JDOMTM都是   以Java为中心和Java优化。它   表现得像Java,它使用Java   收藏品,这是完全自然的   适用于当前Java开发人员的API,以及   它提供了一个低成本的切入点   使用XML。

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

答案 4 :(得分:5)

我使用XStream,它是一个简单的库,可以将对象序列化为XML,然后再返回。

它可以是annotation-driven(就像JAXB一样),但它具有非常简单易用的API,您甚至可以生成JSON。

答案 5 :(得分:3)

我会在@kdgregory中添加内置答案,说明为什么不是JAXB?

通过一些注释,很容易为大多数XML文档建模。我的意思是你可能会解析这些东西然后放入一个物体吗?

JAXB 2.0内置于JDK 1.6中,与许多其他内置javax库不同,这个非常好(Kohusuke使用它,所以你知道它很好)。

答案 6 :(得分:2)

在最近的一个项目中,我不得不进行一些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替代品,但我还没有完全接受它。好奇没有人在这里提到过简单框架我决定解决这个问题,因为我可能会再次使用它。)

答案 7 :(得分:1)

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

答案 8 :(得分:0)

你可以尝试JAXB,注释非常方便易用:Java Architecture for XML Binding.

答案 9 :(得分:0)

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

当然它只适用于最简单的XML操作,例如查找具有给定名称的标记,迭代结构,替换标记及其属性,但这不是最常用的情况吗?

答案 10 :(得分:0)

为了构建XML文档,我建议xmlenc。它用于cassandra