如何简明扼要地用Java构建XML文档?

2022-09-02 04:39:11

我需要从 Java 对象层次结构构建一个 XML 文档。Java 类和 XML 格式都是固定的。所以我不能使用像XStream这样的XML序列化程序:它基于Java类的XML格式。同样,像JAXB这样的Java XML绑定技术也不起作用,因为它从XML模式创建Java类[ed:但见下文]。我需要手动方法。

低技术含量的StringBuilder路由会导致脆弱和错误的代码(至少对我来说是这样!

JAXPJDOM这样的API会带来更健壮的代码,但这些代码非常冗长。

Groovy有一个优雅的MarkkBuilder

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.records() {
  car(name:'HSV Maloo', make:'Holden', year:2006) {
    country('Australia')
    record(type:'speed', 'Production Pickup Truck with speed of 271kph')
  }
  car(name:'P50', make:'Peel', year:1962) {
    country('Isle of Man')
    record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg')
  }
}

其他语言(例如。红宝石)有更好的,尽管我想继续使用纯Java。似乎确实有一些新的Java XML构建器,例如actualxml和James Murty的xmlbuilder

在Java中构建XML文档的更优雅的方法是什么?

总结:

Jon Doe建议使用dom4jjdom

无论如何,CurtainDog都建议使用JAXB,jherico告诉我这是一个相关的建议:然后你可以使用Dozer在我当前的JavaBeans和JAXB JavaBeans之间进行映射。

thaggie推荐JIBX,并同意CurtainDog和jherico的观点,即绑定技术实际上是实用的。

StaxMan推荐StaxMate

在我看过的东西中,practicalxml和James Murty的xmlbuilder似乎是最简洁的构建器,尽管它们相当新奇。像JAXB这样的绑定技术似乎提供了额外的安全性/自动化。在主流选择中,dom4j看起来不错,尽管仍然有点冗长。它提供了一个“流畅的界面”(赋值器返回对突变对象的引用,以便它们可以链接在一起),我喜欢:

public Document createDocument() {
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement( "root" );
    Element author2 = root.addElement( "author" )
      .addAttribute( "name", "Toby" )
      .addAttribute( "location", "Germany" )
      .addText( "Tobias Rademacher" );
    Element author1 = root.addElement( "author" )
      .addAttribute( "name", "James" )
      .addAttribute( "location", "UK" )
      .addText( "James Strachan" );
    return document;
}

为了简洁起见,您可以在此API上包装一个薄外观,以便为其中一些方法提供简洁的同义词(例如,attr()而不是addAttribute())。

谢谢大家!

附言:Stephan Schmidt曾参与Java MarkupBuilder的开发,尽管似乎没有发布过。


答案 1

dom4j或jdom可能是最优雅的,你可以按照自己喜欢的方式编写代码。如果我记得的话,Dom4j有构建器,是的,代码更详细。

Element.addElement("x").setAttribute("x", "y").xxxxx;

答案 2

看看XOM。它快速,简单,正确,并且不冗长。


推荐