您推荐啥 Java XML 库(替换 dom4j)? [关闭]

Posted

技术标签:

【中文标题】您推荐啥 Java XML 库(替换 dom4j)? [关闭]【英文标题】:What Java XML library do you recommend (to replace dom4j)? [closed]您推荐什么 Java XML 库(替换 dom4j)? [关闭] 【发布时间】:2010-10-24 07:55:19 【问题描述】:

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

背景:我一直在使用and advocating dom4j,但感觉不太对,因为我知道该库远非最佳(例如:查看与 XSLT 相关的Stylesheet 类中的方法如何记录在案;您会将什么作为 String mode 参数传递给 run()?)

要求: 与using pure JDK(javax.xmlorg.w3c.dom 包)相比,该库应该使基本的 XML 处理更容易。像这样的事情:

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

我真的很喜欢 dom4j promises,实际上:“易于使用,用于处理 XML、XPath 和 XSLT [...] 的开源库,完全支持 DOM、SAX 和 JAXP。" 即将推出的 dom4j 2.0 确实声称修复了所有问题:充分利用 Java 5 并添加缺失的文档。但很遗憾,如果你look closer:

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

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

【问题讨论】:

看来他们已经失去了dom4j.org 域(也许另一个迹象表明确实应该用其他东西替换它......)——尽管如此,该网站仍然可以在dom4j.sourceforge.net 访问。 查看更多关于该主题的帖子:***.com/questions/373833/best-xml-parser-for-java 和 ***.com/questions/25614/…。关于 jdom/dom4j/xom 的注意事项也在这里:lists.xml.org/archives/xml-dev/200410/msg00492.html 哦,刚刚注意到终于发布了 dom4j 2.0 alpha 版本:sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2(尽管他们还没有恢复他们的dom4j.org 域。)有人试过吗? @vtd-xml。不,我没听说过...如果您认为它是问题中所述的一个很好的 dom4j 替代品,请考虑发布有关它的完整答案 另一种选择是您始终可以帮助 dom4j 团队制作更好的 dom4j。拿起叉子,潜入并提交一些补丁。 【参考方案1】:

当然,XOM :-)

XOM 旨在易于学习 并且易于使用。它非常有效 直截了当,并且有一个非常 浅学习曲线。假设 你已经熟悉 XML,你 应该能够启动并运行 非常快地使用 XOM。

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

XOM 是唯一一个没有 在正确性上妥协。仅限 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 的作者对 Artima 的 5 部分采访,他们谈到了 what's wrong with XML APIs、The Good, the Bad, and the DOM、A Design Review of JDOM、Lessons Learned from JDOM,最后是 Design Principles and XOM。

【讨论】:

XOM 看起来确实很有前途,特别是考虑到它的创建者清楚地知道现有的库,并尝试改进它们。与 dom4j 和 JDOM 相比,它似乎也更加活跃:最新版本是 2009 年 3 月(尽管之前的版本是 2006 年 8 月)。这些天我正在尝试 XOM,看看我是否真的可以像使用 dom4j 一样或更轻松地使用它。 好的,我一直在测试 XOM(利用 Stack Overflow 来解决一些不错的小问题:***.com/questions/883987/…、***.com/questions/428073/…、***.com/questions/139076/… 等 :-),我'我开始确信我可以用 XOM 做几乎所有我可以用 dom4j 做的事情! (cont) 但是,我对流式 XML 数据存有疑虑,我以前用 dom4j 做过。这是我写的一个问题,也许你知道答案? ***.com/questions/967288/… 当心。将 dom4j/jdom 转换为 XOM 是一件很痛苦的事情。此外,API 不支持 Java 集合。两者都是很痛的地方。 只是在使用 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 具有。【参考方案2】:

The one built into the JDK ...还有一些补充。

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

不过,正如我所说,我确实做了些许改进:Practical XML 库是实用类的集合,可以更轻松地使用 DOM。除了 XPath 包装器之外,这里没有什么复杂的东西,只是我发现自己为每项工作都重写了一堆例程。

【讨论】:

我同意。我曾经对 JDom 发誓,但发现一旦我写了一些辅助方法,JAX-P 的东西就不再难了,而且到处都安装了。 JAXB 也是内置的,非常好。【参考方案3】:

我一直在使用 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());

【讨论】:

这看起来很棒,正是我支持一些数据驱动测试所需要的。【参考方案4】:

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

来自使命宣言:

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

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

【讨论】:

酷。你读过我问题的最后一句话吗? ;-) +1 - 比所有 W3C 的东西都简单。 我最近在一个项目中使用了 JDOM,虽然 API 很直观,但我有两个问题:开发似乎停滞不前(最后一次更新是 2007 年底)并且库已经尚未通用化。 如果我选择 JDOM 与 XOM,我选择 XOM。 看起来像JDOM 2.0.0 was just released:“2.0.0 将 JDOM 带入了泛型世界和 Java 5 引入的其他 Java 语言项目。”【参考方案5】:

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

可以是annotation-driven(类似JAXB),但是它有非常简单易用的api,你甚至可以生成JSON。

【讨论】:

看起来很简单。只是想知道它实际上是如何工作的:如果我从互联网上下载了一个 XML,XStream 怎么知道它应该反序列化到哪个类? @ettore 没有。你应该使用 JAXB 来做类似的事情,因为它理解模式和 WSDL。 对于像 dom4j 这样的通用 XML API 来说并不是真正的替代品。它只是一个序列化器/反序列化器,不是吗?【参考方案6】:

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

使用一些注解可以很容易地为大多数 XML 文档建模。我的意思是你可能会解析这些东西并放入一个对象吧?

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

【讨论】:

我想知道 JAXB 2.0 与像 Simple 这样的基于注释的轻量级 XML 库相比,在简单性和避免样板方面如何......? (在我问这个问题的那天,我有点想念 JAXB,但如果需要用 Java 做 XML,我想值得仔细看看。)【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

Castor 确实支持 JAXB。您可以选择使用映射文件或使用 XML 模式和 Castor 的代码生成器。 我不知道,谢谢你的信息!【参考方案9】:

您可以尝试 JAXB,它的注释非常方便且简单:Java Architecture for XML Binding.

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

对于构建 XML 文档,我建议 xmlenc。用于cassandra。

【讨论】:

这个工具有什么优势?

以上是关于您推荐啥 Java XML 库(替换 dom4j)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

dom4j解析xml,xml数据替换,生成新的xml

Dom4J解析xml文件

Java修炼之路——读取XML文件

在myeclipse中 如何用dom4j解析xml文件,流程详细点好

java操作xml文档

成都校区Dom4J解析XML的范例浅析