【问题标题】:A nice Java XML DOM utility一个不错的 Java XML DOM 实用程序
【发布时间】:2011-10-23 04:27:54
【问题描述】:

我发现自己一遍又一遍地编写同样冗长的 DOM 操作代码:

Element e1 = document.createElement("some-name");
e1.setAttribute("attr1", "val1");
e2.setAttribute("attr2", "val2");
document.appendChild(e1);

Element e2 = document.createElement("some-other-name");
e.appendChild(e2);

// Etc, the same for attributes and finding the nodes again:
Element e3 = (Element) document.getElementsByTagName("some-other-name").item(0);

现在,我不想一起切换架构,即我不想使用 JDOM、JAXB 或其他任何东西。只是 Java 的org.w3c.dom。原因是

  1. 这是关于一个古老而庞大的遗留系统
  2. XML 被多处使用,XSLT 多次转换得到 XML、HTML、PDF 输出
  3. 我只是为了方便,而不是大的改变。

我只是想知道是否有一个不错的包装库(例如,使用 apache commons 或 google),它允许我以类似于jRTF 的流畅风格做这样的事情:

// create a wrapper around my DOM document and manipulate it:
// like in jRTF, this code would make use of static imports
dom(document).add(
  element("some-name")
    .attr("attr1", "val1")
    .attr("attr2", "val2")
    .add(element("some-other-name")),
  element("more-elements")
);

然后

Element e3 = dom(document).findOne("some-other-name");

我在这里的重要要求是我明确希望在 org.w3c.dom.Document 上进行操作

  1. 已经存在
  2. 很大
  3. 需要相当多的操作

因此,将org.w3c.dom.Document 转换为 JDOM、dom4j 等似乎是个坏主意。我更喜欢用适配器包装它。

如果它不存在,我可能会推出自己的,因为这个 jRTF 语法看起来非常好!而对于 XML,它似乎很容易实现,因为只有很少的节点类型。从 fluent API 的角度来看,这可能会变得像 jquery 一样强大!

【问题讨论】:

  • Dom4J 几乎完全做到了这一点,但它拥有自己的 DOM 实现。如果您想重建此功能,请继续,但如果我是您,我会使用 Dom4J。
  • @Sean,对我来说,dom4j 看起来和 DOM 本身一样冗长。但也许我错过了稀缺文档中的流畅 API?此外,我希望该库实际上会在 org.w3c.dom 结构上运行,而不是创建自己的
  • 我知道您出于某种原因正在注销 JAXB,如果您拥有或可以为您的输入文件创建 XSD,它会为您生成所有代码解组和编组,并为您提供一个不错的真实 Java使用的对象模型。
  • @Jarrod:原因是:没有 XSD,XML 可以任意复杂,数据源来自数据库,标签是数据库列,或其转换,编组和解组意味着对相当大的文档等进行额外的转换步骤...,我想使用 XSLT,稍后进行处理,所以标准 DOM 可能是最好的选择,或者可能是包装 DOM...

标签: java xml dom


【解决方案1】:

为了详细说明我的评论,Dom4J 让您非常接近您想要的:

final Document dom = DocumentHelper.createDocument().addElement("some-name")
        .addAttribute("attr1", "val1")
        .addAttribute("attr2", "val2")
        .addElement("some-other-name").getDocument();
System.out.println(dom.asXML());

输出:

<?xml version="1.0" encoding="UTF-8"?>
<some-name attr1="val1" attr2="val2"><some-other-name/></some-name>

我知道它不是原生 DOM,但它非常相似,并且为 Java 开发人员提供了非常好的功能(元素迭代器、实时元素列表等)

【讨论】:

  • 好的,看起来很相似。但是也要详细说明我的评论... ;-) 我不想创建新文档,而是对现有文档进行操作(而且它们非常大,因此性能/内存在这里是一个问题)。所以,我猜,Dom4J 不允许这样做?
  • @Lukas 当然它允许您操作现有文档,但我猜性能/内存要求对于大型文档来说应该是不好的。我没有使用 Dom4J 处理大于几百 K 的文档,所以我不知道。
  • 它是通过将org.w3c.dom.Document 转换为org.dom4j.Document 来实现的,对吗?这就是我想避免的......
  • @Lukas 它允许您修改现有的 Dom4J 文档 :-)
  • 仅供参考,与 DOM (Xerces) 相比,DOM4J 的内存占用显着降低。
【解决方案2】:

我发现一些工具可以大致完成我在问题中要求的功能:

但是,与此同时,我更倾向于自己动手。我真的是 jquery 的忠实粉丝,我认为 jquery 可以映射到 Java fluent API:

http://www.jooq.org/products/jOOX

【讨论】:

  • 我有一个类似的项目,但它仅用于流式输出(因此它对内存非常友好,因为它不会加载整个 DOM)请参阅JATL
【解决方案3】:

好吧,这可能很愚蠢,但您为什么不自己实现那个小 API?我相信您对 DOM API 非常了解,并且不会花费太多时间来实现您想要的。

顺便说一句,考虑使用 XPath 来处理文档(你也可以在这个上实现你的 mini-api)。

【讨论】:

  • 感谢您的提示。正如我所说,如果这还不存在,我将自己推出。关于使用 XPath 而不是 DOM,请阅读我的 previous question about XPath performance。出于性能原因,应尽可能阻止 XPath。
  • 是的,我还注意到 XPath 的性能问题,并且我主要使用您之前写的直接 DOM 操作。无论如何,我经常会在使用任何“标准”API 时实现自己的 mini-api,因为它大多不适合我。
  • 为什么不呢,如果你给我你的电子邮件或任何联系方式:-)
  • 我几乎完成了 jquery 到 Java 的基本端口:code.google.com/p/joox。那里还有一个用户组,如果你想贡献,可以联系我!
猜你喜欢
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多