【发布时间】: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。原因是
- 这是关于一个古老而庞大的遗留系统
- XML 被多处使用,XSLT 多次转换得到 XML、HTML、PDF 输出
- 我只是为了方便,而不是大的改变。
我只是想知道是否有一个不错的包装库(例如,使用 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 上进行操作
- 已经存在
- 很大
- 需要相当多的操作
因此,将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...