低技术的StringBuilder方法会导致脆弱和有缺陷的代码(至少对我来说如此!)。
像JAXP或JDOM这样的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')
}
}
其他编程语言(例如Ruby)有更好的XML构建工具,但我想保持使用纯Java。目前似乎有一些新的Java XML构建工具,例如practicalxml和James Murty的xmlbuilder。
在Java中构建XML文档的更优雅的方法是什么?
总结:
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())。
谢谢大家!
P.S.:Stephan Schmidt曾经开发过一个Java MarkupBuilder,但似乎没有发布。