你推荐什么Java XML库(replacedom4j)?

我正在寻找类似dom4j的东西,但没有dom4j的瑕疵,比如文档不好或丢失,以及似乎停滞的开发状态。

背景:我一直在使用和 倡导 dom4j,但是感觉并不完全正确,因为我知道库很不理想(例如:请参阅XSLT相关的Stylesheet类中的方法是如何logging的;将通过什么来运行)作为String mode参数?)

要求:该库应该比使用 纯JDK ( javax.xmlorg.w3c.dom包)更容易进行基本的XML处理。 像这样的事情:

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

我真的很喜欢dom4j所承诺的 ,实际上:“ 易于使用,与XML,XPath和XSLT一起工作的完全支持DOM,SAX和JAXP的开放源代码库。 ”即将到来的dom4j 2.0确实宣称解决了所有问题:充分利用Java 5并添加缺less的文档。 但不幸的是,如果你仔细观察 :

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

…和网站已经说了很长一段时间。 那么dom4j有没有好的select? 请为您喜欢的图书馆提供一些理由,而不是仅仅倾销名字和链接。 🙂

当然, XOM 🙂

XOM被devise为易于学习和易于使用。 它工作很直接,学习曲线很浅。 假设你已经熟悉XML,那么你应该能够很快熟悉并运行XOM。

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

XOM是唯一不会影响正确性的XML API。 XOM只接受名称空间格式良好的XML文档,只允许您创build名称空间格式良好的XML文档。 (实际上,它比这更严格:它实际上保证所有文档都是可循环的,并且具有定义良好的XML信息。)XOMpipe理您的XML,因此您不必这样做。 借助XOM,您可以专注于应用程序的独特价值,并相信XOM能够正确使用XML。

查看网页http://www.xom.nu/获取常见问题解答,食谱,devise原理等。如果只有一切都devise了这么多的爱情;:-)

作者还写了关于XML API的错误(以及如何解决这些错误) 。 (基本上,XOM首先存在的原因)

这里还有一个关于XOM的关于作者的5部分Artima采访,他们谈论了XML API , 好,坏和DOM , JDOM的devise评论,JDOM的 经验教训以及最终的devise原则和XOM 。

JDK中内置的一个 …有几个补充。

是的,使用起来很痛苦:它是根据W3C规范devise的,这个规范是由委员会明确devise的。 但是,它可以在任何地方使用,如果你对此置之度外,就不会遇到来自第三方库的“我喜欢Dom4J”,“我喜欢JDOM”,“我喜欢StringBuffer”的争论。 特别是因为这样的参数可以变成使用不同的库不同的代码片段…

但是,正如我所说的,我确实略微提高了一点: Practical XML库是一个工具类的集合,可以更容易地使用DOM 。 除了XPath包装器之外,这里没有什么复杂的东西,只是我发现自己正在为每项工作重写一堆例程。

我一直在使用XMLToolreplaceDom4j,而且工作得很好。

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而开发的,并且很容易在选定的元素上创build一个可迭代的对象:

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

我一直喜欢jdom 。 它被写成比DOMparsing更直观(无论如何SAXparsing总是笨拙)。

从使命宣言:

Java API没有强制性的理由来操纵XML是复杂的,棘手的,不直观的,或者是一个痛苦的脖子。 JDOMTM既是以Java为中心又是Java优化的。 它的行为与Java相似,它使用Java集合,对于当前的Java开发人员来说,它是完全自然的API,它为使用XML提供了一个低成本的切入点。

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

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

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

我会添加到@kdgregory的内置答案,说为什么不JAXB?

通过一些注释,可以很容易地build模大多数XML文档。 我的意思是你可能会parsing的东西,并把对象吗?

JAXB 2.0内置于JDK 1.6中,与其他许多其他内置的javax库不同,这个库是非常好的(Kohusuke对此非常了解)。

在最近的一个项目中,我不得不做一些XMLparsing,最后使用了一个同事推荐的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,于是我决定解决这个问题,因为我可能会再次使用它。)

在我们的项目中,我们使用的是http://www.castor.org/,但只是用于小型的XML文件。; 学习起来非常简单,只需要一个映射XML文件(如果XML标签完全匹配类属性,则不需要),而且完成了。 它支持监听器(如callback)来执行额外的处理。 缺点:它不像JAXB这样的Java EE标准。

您可以尝试JAXB,注释非常方便和简单: Java绑定XML体系结构。

我有时候使用的是Jericho ,主要是HTMLparsing器,但是可以parsing任何类似于XML的结构。

当然,它只适用于最简单的XML操作,比如查找具有给定名称的标签,遍历结构,replace标签及其属性,但这不是最常见的用例吗?

为了构buildXML文档,我build议使用xmlenc 。 它在cassandra中使用 。