一个不错的JavaXMLDOM实用程序

一个不错的JavaXMLDOM实用程序,java,xml,dom,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); //

我发现自己一次又一次地编写相同的冗长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),它允许我以类似以下的流畅风格完成类似的事情:

    然后

    Element e3 = dom(document).findOne("some-other-name");
    
    我这里的重要要求是,我明确希望在
    org.w3c.dom.Document
    上操作

  • 已经存在
  • 它相当大
  • 需要相当多的操作
  • 因此,将
    org.w3c.dom.Document
    转换为JDOM、dom4j等似乎是个坏主意。我更喜欢用适配器包装它


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

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

    好吧,这可能很愚蠢,但是为什么不自己实现这个小API呢?我相信您对domapi非常了解,实现您想要的东西不会花费太多时间


    BTW考虑使用XPath进行文档操作(也可以在这一点上实现Mini API)。

    < P>我发现一些工具大致符合我的问题:

    然而,与此同时,我更倾向于自己打滚。我非常喜欢jquery,我认为jquery可以映射到Java fluent API:


    Dom4J几乎完全做到了这一点,但它有自己的DOM实现。如果您想重建此功能,请继续,但如果我是您,我会使用Dom4J。@Sean,在我看来,Dom4J和DOM本身一样冗长。但也许我在稀少的文档中遗漏了fluent API?除此之外,我更喜欢库是否实际在
    org.w3c.dom
    结构上运行,而不是创建自己的库我知道您出于某种原因正在注销JAXB,如果您有或可以为输入文件创建XSD,它为您生成所有的代码进行解组和封送处理,并为您提供一个很好的真实Java对象模型。@Jarrod:原因是:没有XSD,XML可以任意复杂,数据源来自数据库,标记是数据库列,或其转换,编组和解组将意味着对相当大的文档等需要额外的转换步骤,我想稍后使用XSLT进行处理,因此标准DOM可能是最佳选择,或者包装DOM……好的,看起来类似。但我也要详细说明我的评论…;-)我不想创建新文档,但要对现有文档进行操作(它们非常大,所以性能/内存是一个问题)。所以,我猜,Dom4J不允许这样做?@Lukas当然它允许您操作现有文档,但我猜性能/内存需求对于大型文档来说应该是不好的。我没有将Dom4J用于大于几百K的文档,所以我不知道。它是通过将
    org.w3c.dom.Document
    转换为
    org.Dom4J.Document
    来实现的,对吗?这就是我想要避免的…@Lukas它允许您修改现有的Dom4J文档:-)仅供参考,Dom4J与DOM(Xerces)相比,内存占用要低得多。谢谢您的提示。正如我所说的,如果这还不存在,我将推出我自己的。关于使用XPath而不是DOM,请阅读我的。如果可能的话,出于性能原因,应该阻止XPath。是的,我也注意到了XPath的性能问题,我主要使用直接DOM操作,正如您之前所写的。不管怎样,我经常会在使用任何“标准”api时实现自己的迷你api,因为它大多不适合我。为什么不呢,如果你给我你的电子邮件或任何联系人:-)我几乎完成了jquery到Java的基本端口:。那里还有一个用户组,如果你愿意贡献,你可以在那里与我联系!我有一个类似的项目,但它只用于流式输出(因此它对内存非常友好,因为它不加载整个DOM)。
    <?xml version="1.0" encoding="UTF-8"?>
    <some-name attr1="val1" attr2="val2"><some-other-name/></some-name>