你推荐什么Java XML库(替换dom4j)?
我正在寻找像dom4j这样的东西,但没有dom4j的瑕疵,例如文档不好或丢失,看似停滞的开发状态。
背景:我一直在使用和提倡dom4j,但是我觉得它并不完全正确,因为我知道库远非最佳(例如:看看XSLT相关样式表类中的方法是如何记录的;你会传递什么来运行( )作为org.w3c.dom参数?)
要求:与使用纯JDK(org.w3c.dom和org.w3c.dom软件包)相比,该库应该使基本的XML处理更容易。 这样的事情:
将XML文档(从文件或字符串)读入对象,轻松遍历和操作DOM,执行XPath查询并针对它运行XSLT。
在Java代码中构建XML文档,添加元素,属性和数据,最后将文档写入文件或字符串。
我真的很喜欢dom4j所承诺的,实际上:“易于使用的开源库,用于处理XML,XPath和XSLT [...],完全支持DOM,SAX和JAXP。” 即将推出的dom4j 2.0确实声称可以解决所有问题:充分利用Java 5并添加缺少的文档。 但不幸的是,如果你仔细观察:
警告:dom4j 2.0处于pre-alpha状态 阶段。 可能它不可能 编译。 如果它可以编译 随机它可能无法运行。 如果它偶尔运行它可以 突然爆发。 如果你想使用 dom4j,你想要1.6.1版本。 真。
......并且网站已经说了很长时间了。 那么有没有一个很好的替代dom4j? 请为您的首选库提供一些理由,而不是仅仅转储名称和链接。:-)
Jonik asked 2019-05-06T05:17:48Z
11个解决方案
53 votes
当然,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/]了解常见问题,食谱,设计原理等。如果只有一切设计都有这么多的爱:-)
作者还写了关于XML API的错误(以及如何修复它们)的文章。 (基本上,首先存在XOM的原因)
以下是Artima对作者关于XOM的五部分采访,他们谈到了XML API,好的,坏的和DOM的错误,JDOM的设计评论,JDOM的经验教训以及最终的设计原则和XOM。
Peter Štibraný answered 2019-05-06T05:18:44Z
17 votes
JDK中内置的一个...添加了一些。
是的,使用起来很痛苦:它是根据委员会明确设计的W3C规范建模的。 但是,它可以在任何地方使用,如果你坚持下去,你就不会遇到“我喜欢Dom4J”,“我喜欢JDOM”,“我喜欢StringBuffer”这些来自第三方库的论点。 特别是因为这些参数可以使用不同的库变成不同的代码片段......
但是,正如我所说,我的确略有增强:实用XML库是一组实用程序类,可以更轻松地使用DOM。 除了XPath包装器之外,这里没有什么复杂的东西,只是我发现自己为每个工作重写的一堆例程。
kdgregory answered 2019-05-06T05:19:24Z
10 votes
我一直在使用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());
}
Gilberto Olimpio answered 2019-05-06T05:20:04Z
6 votes
我一直很喜欢jdom。 它被编写为比DOM解析更直观(并且无论如何SAX解析总是显得笨拙)。
从使命宣言:
没有令人信服的理由 用于操纵XML的Java API 复杂,棘手,不直观或者a 颈部疼痛。 JDOMTM都是 以Java为中心和Java优化。 它 表现得像Java,它使用Java 收藏品,这是完全自然的 适用于当前Java开发人员的API,以及 它提供了一个低成本的切入点 使用XML。
这几乎是我的经验 - 相当直观的节点树导航。
Steve B. answered 2019-05-06T05:20:52Z
5 votes
我使用XStream,它是一个简单的库,可以将对象序列化为XML,然后再返回。
它可以是注释驱动的(如JAXB),但它具有非常简单易用的API,您甚至可以生成JSON。
IAdapter answered 2019-05-06T05:21:23Z
3 votes
我将添加@kdgregory的内置答案,说为什么不是JAXB?
通过一些注释,可以很容易地为大多数XML文档建模。 我的意思是你可能要解析这些东西然后放入一个物体吧?
JAXB 2.0内置于JDK 1.6中,与许多其他内置javax库不同,这个非常好(Kohusuke使用它,所以你知道它的好处)。
Adam Gent answered 2019-05-06T05:22:02Z
2 votes
在最近的一个项目中,我不得不进行一些XML解析,最后使用了由同事推荐的Simple Framework。
最后我很满意。 它使用基于注释的方法将XML元素和属性映射到Java类和字段。
foo
bar
对应的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。我决定解决这个问题, 因为我可能会再次使用它。)
Jonik answered 2019-05-06T05:22:57Z
1 votes
在我们的项目中,我们使用[http://www.castor.org/],但仅用于小型XML文件。 它非常容易学习,只需要一个映射XML文件(如果XML标签匹配完美的类属性,则不需要),并且已经完成。 它支持侦听器(如回调)以执行其他处理。 缺点:它不是像JAXB那样的Java EE标准。
Lluis Martinez answered 2019-05-06T05:23:23Z
0 votes
您可以尝试JAXB,注释非常方便易用:用于XML绑定的Java体系结构。
Taran Singh answered 2019-05-06T05:23:49Z
0 votes
我有时使用Jericho,它主要是HTML解析器,但可以解析任何类似XML的结构。
当然,它仅适用于最简单的XML操作,例如查找具有给定名称的标记,迭代结构,替换标记及其属性,但这不是最常见的用例吗?
Danubian Sailor answered 2019-05-06T05:24:21Z
0 votes
为了构建XML文档,我建议使用xmlenc。 它用于cassandra。
Jingguo Yao answered 2019-05-06T05:24:46Z