您推荐使用什么 JavaXML 库(来替代 dom4j) ?

我正在寻找类似 dom4j 的东西,但是没有 dom4j 的缺陷,比如文档不好或缺失,以及看起来停滞不前的开发状态。

背景: 我一直在使用 还有 主张 dom4j,但是感觉并不完全正确,因为我知道这个库远远不是最佳的(例如: 看看如何记录与 XSLT 相关的 样式表类中的方法; 如果使用 run ()作为 String mode参数,您会传递什么?)

要求: 与 使用纯 JDK(javax.xmlorg.w3c.dom包)相比,这个库应该使基本的 XML 处理变得更加容易。这样的事情:

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

我真的很喜欢 Dom4j 承诺,事实上: “ 易于使用的开放源码库,用于处理 XML、 XPath 和 XSLT [ ... ] ,完全支持 DOM、 SAX 和 JAXP。”和即将到来的 dom4j 2.0声称修复一切: 充分利用 Java 5并添加缺失的文档。但不幸的是,如果你 看仔细点:

警告: dom4j 2.0处于 pre-alpha 状态 阶段。很可能它不能 编译。如果它可以被编译 它很可能无法运行。 以防它偶尔跑起来 突然爆炸。如果你想使用 Dom4j,你想要版本1.6.1。真的。

... 网站上说,在 很长时间。那么,是否有一个很好的 dom4j 替代品?请为您的首选库提供一些理由,而不仅仅是转储名称和链接。:-)

65252 次浏览

我一直很喜欢 Jdom,它比 DOM 解析更直观(而且 SAX 解析总是看起来很笨拙)。

任务说明:

没有令人信服的理由 JavaAPI 来操作 XML 复杂的,狡猾的,不直观的,或者 脖子疼 JDOMTM 两者都是 以 Java 为中心和 Java 优化的 就像 Java 一样,它使用 Java 收藏,这是完全自然的 为当前 Java 开发人员提供 API,以及 它提供了一个低成本的切入点 使用 XML。

这基本上就是我的经验——相当直观的节点树导航。

在我们的项目中,我们使用 http://www.castor.org/,但只是为了小的 XML 文件。它非常容易学习,只需要一个映射 XML 文件(如果 XML 标记与 class 属性完全匹配,则不需要映射 XML 文件)就可以完成。它支持侦听器(如回调)执行额外的处理。缺点: 它不是 JAXB 那样的 JavaEE 标准。

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

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

当然,XOM: -)

XOM 的设计是为了易于学习 而且使用方便,非常好用 直截了当,而且有一个非常 学习曲线很浅,假设 您已经熟悉了 XML,那么您 应该能够启动并运行 非常快速地使用 XOM。

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

XOM 是唯一一个没有 对正确性的妥协,仅限 XOM 接受格式良好的 XML 名称空间 文件,而且只允许你 创建格式良好的 XML 命名空间 (事实上,这有点 比那更严格: 实际上 保证所有文件 可往返且定义明确 XOM 如此管理您的 XML 你不需要,有了 XOM 你就可以 专注于你的独特价值 应用程序,并信任 XOM 获取 XML 没错。

查看网页 http://www.xom.nu/的常见问题,食谱,设计原理等。要是一切都是用这么多的爱来设计的就好了: -)

作者还写了关于 XMLAPI 有什么问题(以及如何修复它们)的文章(基本上是关于 XOM 最初存在的原因)

这里还有5部分 Artima 对作者关于 XOM 的采访,他们谈到了 XML API 有什么问题好的,坏的,和 DOMJDOM 设计综述从 JDOM 中学到的教训,最后是 设计原理与 XOM

内置在 JDK 中的那个... ... 添加了一些内容。

是的,使用起来很痛苦: 它是按照委员会明确设计的 W3C 规范建模的。然而,它在任何地方都可以使用,如果你决定使用它,你就不会遇到来自第三方库的“我喜欢 Dom4J”、“我喜欢 JDOM”、“我喜欢 StringBuffer”的争论。特别是因为这样的参数可以转换成使用不同库的不同代码片段..。

然而,正如我所说,我确实略有增强: 实用 XML 库是一个实用类的集合,它使得使用 DOM 变得更加容易。除了 XPath 包装器之外,这里没有什么复杂的东西,只是一堆例程,我发现自己要为每个作业重写这些例程。

我一直在使用 XMLTool来代替 Dom4j,它工作得非常好。

XML 工具使用 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());

它是为 Java5设计的,并且很容易创建一个可迭代的对象 选定元素:

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

我将通过@kdgreory 添加到内置答案中,说明为什么不使用 JAXB?

只需要一些注释,就可以很容易地对大多数 XML 文档建模。我的意思是你可能会解析这些东西,然后放入一个对象,对吗?

JAXB 2.0是内置在 JDK 1.6中的,与其他内置的 javax 库不同,这个版本相当不错(Kohusuke 对它进行了改进,所以你知道它的优点)。

您可以尝试 JAXB,它的注释非常方便和简单: JAXB.

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

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

对于构建 XML 文档,我建议使用 Xmlenc

在最近的一个项目中,我不得不进行一些 XML 解析,最后使用了同事推荐的 一个简单的框架

最后我还是很满意的。它使用一种基于注释的方法将 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 处理代码,但是一开始您可能会为了正确地使用注释而碰壁一段时间。

(四年前是我问的这个问题。虽然 XOM看起来是一个不错的、相当受欢迎的 dom4j 替代品,但我还没有完全接受它。奇怪的是没有人在这里提到过简单框架。我决定解决这个问题,因为我可能会再次使用它。)