我需要从Java对象层次结构构建XML文档。Java类和XML格式都是固定的。所以我不能像这样使用XML序列化程序
XStream
它基于Java类上的XML格式。同样,类似Java的XML绑定技术
JAXB
不起作用,因为它从XML schema创建了Java类(ED:但是见下文)。我需要一个手动的方法。
低技术的StringBuilder路线会导致代码脆弱和有缺陷(至少对我来说是这样!).
类API
JAXP
或
JDOM
导致了更健壮的代码,但这些代码相当冗长。
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
甚至有更好的,虽然我想留在纯Java。似乎有一些新的Java构建器,比如
practicalxml
还有詹姆斯·墨蒂的
xmlbuilder
.
在Java中构建XML文档的更为优雅的方法是什么?
总结:
乔恩·多伊建议
dom4j
和
jdom
.
不管怎样,Curtaindog推荐使用JAXB,Jherico告诉我这是一个有针对性的建议:然后你可以使用Dozer在我当前的JavaBeans和JAXB JavaBeans之间进行映射。
Thaggie建议
JIBX
并且同意Curtaindog和Jherico的观点,即绑定技术实际上是可行的。
Staxman建议
StaxMate
.
在我所看到的内容中,实用XML和JamesMurty的XML构建器似乎是最简洁的构建器,尽管它们相当新颖。像JAXB这样的绑定技术似乎提供了额外的安全性/自动化。在主流选择中,
多姆J
看起来不错,不过还是有点冗长。它提供了一个“fluent接口”(mutator返回对突变对象的引用,以便将它们链接在一起),我喜欢这样:
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())的简洁同义词。
谢谢大家!
斯特凡·施密特用JAVA工作
MarkupBuilder
但似乎还没有发表。