如何简洁地在Java中构建XML文档?

Jim*_*ans 20 java xml builder

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

低技术的StringBuilder路由导致脆弱和错误的代码(至少对我而言!).

JAXPJDOM这样的API 可以提供更强大的代码,但这些代码非常冗长.

Groovy有一个优雅的MarkupBuilder:

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')
  }
}
Run Code Online (Sandbox Code Playgroud)

其他语言(例如Ruby)甚至更好,但我希望保留纯Java.似乎有一些新的Java构建器用于Java,例如practicalxml和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似乎还不错,但仍然有点冗长.它提供了一个"流畅的界面"(mutators返回对变异对象的引用,因此它们可以链接在一起),我喜欢:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢大家!

PS:Stephan Schmidt参与了Java MarkupBuilder,虽然似乎没有发布它.

小智 10

dom4j或者jdom可能是最优雅的,你可以根据自己的喜好编写代码.如果我记得,Dom4j有建设者,是的,代码更冗长.

Element.addElement("x").setAttribute("x", "y").xxxxx;
Run Code Online (Sandbox Code Playgroud)