题
我需要从Java对象层次结构构建XML文档。 Java类和XML格式都是固定的。所以我不能使用像 XStream 这样的XML序列化器:它基于Java类的XML格式。同样,像 JAXB 这样的Java XML绑定技术将不起作用,因为它从XML模式创建Java类[编辑:但见下文]。我需要手动方法。
低技术的StringBuilder路由导致脆弱和错误的代码(至少对我而言!)。
像 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构建器用于Java,例如 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 看似不错,但仍然有点冗长。它提供了“流畅的界面”。 (mutators返回对mutated对象的引用,以便它们可以链接在一起),我喜欢:
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())。
全部谢谢!
PS:Stephan Schmidt致力于Java MarkupBuilder ,虽然似乎没有发表它。解决方案
dom4j或jdom可能是最优雅的,你可以根据自己的喜好编写代码。如果我记得,Dom4j有建设者,是的,代码更详细。
Element.addElement("x").setAttribute("x", "y").xxxxx;
不隶属于 StackOverflow