76

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

背景:我一直在使用 提倡dom4j,但我觉得它并不完全正确,因为我知道该库远非最佳(例如:查看 XSLT 相关样式表类中的方法是如何记录的;你会传递什么来运行( ) 作为String mode参数?)

要求:该库应该比使用 纯 JDKjavax.xmlorg.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 有什么好的替代品吗?请为您的首选库提供一些理由,而不仅仅是转储名称和链接。:-)

4

11 回答 11

53

当然,XOM :-)

XOM 旨在易于学习和使用。它的工作非常简单,并且学习曲线非常浅。假设您已经熟悉 XML,您应该能够很快地开始使用 XOM。

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

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

查看网页http://www.xom.nu/以获取常见问题解答、食谱、设计原理等。如果一切都是用如此多的爱设计的 :-)

作者还写了关于XML API 出了什么问题(以及如何修复它们)的文章。(基本上,XOM首先存在的原因)

这里也是 Artima 对作者关于 XOM 的采访,由 5 部分组成,他们讨论了 XML API 的问题好的、坏的和 DOMJDOM 的设计回顾,从 JDOM 中学到的教训,最后是设计原则和 XOM

于 2009-05-07T07:01:39.597 回答
18

内置于 JDK 中的一个……还有一些附加功能。

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

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

于 2009-05-07T12:11:31.130 回答
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());
}
于 2009-12-07T15:55:23.007 回答
6

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

从使命宣言:

没有令人信服的理由让 Java API 将 XML 操作为复杂、棘手、不直观或令人头疼的问题。JDOMTM 既以 Java 为中心,又针对 Java 进行了优化。它的行为类似于 Java,它使用 Java 集合,它是当前 Java 开发人员完全自然的 API,它为使用 XML 提供了一个低成本的入口点。

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

于 2009-05-06T21:31:36.643 回答
5

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

它可以是注解驱动的(如 JAXB),但它的 api 非常简单易用,您甚至可以生成 JSON。

于 2009-05-06T21:56:24.773 回答
3

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

于 2013-06-11T10:32:13.003 回答
3

我将通过说为什么不是 JAXB 来添加@kdgregory 的内置答案?

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

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

于 2011-04-02T13:44:59.737 回答
1

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

于 2009-05-06T21:42:21.313 回答
0

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

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

于 2012-02-24T11:47:09.347 回答
0

你可以试试 JAXB,它的注解非常方便和简单:Java Architecture for XML Binding。

于 2012-01-22T00:43:13.583 回答
0

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

于 2012-07-12T06:14:03.467 回答