一个很好的Java XML DOM实用程序

时间:2011-08-09 12:13:32

标签: java xml dom

我发现自己一遍又一遍地编写相同的详细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. 我只是在寻找便利,而不是一个大的改变。
  4. 我只是想知道是否有一个不错的包装器库(例如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. 需要相当多的操作
    4. 因此将org.w3c.dom.Document转换为JDOM,dom4j等似乎是一个坏主意。用适配器包装它是我更喜欢的。

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

3 个答案:

答案 0 :(得分:4)

为了详细说明我的评论,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开发人员提供了非常好的功能(元素迭代器,实时元素列表等)。

答案 1 :(得分:4)

我发现了一些工具大致按照我的要求提出了我的要求:

然而,与此同时,我更倾向于自己推出。我真的是jquery的忠实粉丝,我认为jquery可以映射到Java流畅的API:

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

答案 2 :(得分:1)

嗯,这可能很傻,但为什么不自己实现这个小API呢?我相信你很了解DOM API,并且不需要花费太多时间来实现你想要的东西。

顺便说一下,考虑使用XPath进行文档操作(你也可以在这个上实现你的mini-api)。