我需要从 Java 对象层次结构构建 XML 文档。Java 类和 XML 格式都是固定的。所以我不能使用像XStream这样的 XML 序列化器:它基于 Java 类的 XML 格式。同样,像JAXB这样的 Java XML 绑定技术也不起作用,因为它从 XML 模式创建 Java 类 [ed: 但见下文]。我需要一种手动方法。
技术含量低的 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)甚至有更好的语言,尽管我想继续使用纯 Java。似乎确实有一些用于 Java 的新 XML 构建器,例如actualxml和 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())。
谢谢大家!
PS:Stephan Schmidt 从事 Java MarkupBuilder工作,但似乎没有发布它。