gpt4 book ai didi

java - 如何简洁地用 Java 构建 XML 文档?

转载 作者:IT老高 更新时间:2023-10-28 20:54:16 24 4
gpt4 key购买 nike

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

技术含量低的 StringBuilder 路线会导致代码脆弱且有缺陷(至少对我而言!)。

JAXP 这样的 API或 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 XML 构建器,例如 practicalxml和 James Murty 的 xmlbuilder .

在 Java 中构建 XML 文档的更优雅的方法是什么?

总结:

Jon Doe 建议 dom4jjdom .

CurtainDog 还是建议使用 JAXB,jherico 告诉我这是一个相关的建议:然后您可以使用 Dozer 在我当前的 JavaBeans 和 JAXB JavaBeans 之间进行映射。

thaggie 推荐 JIBX并同意 CurtainDog 和 jherico 的观点,即绑定(bind)技术实际上是实用的。

StaxMan 推荐 StaxMate .

在我看过的东西中,practicalxml 和 James Murty 的 xmlbuilder 似乎是最简洁的构建器,尽管它们是相当新的。像 JAXB 这样的绑定(bind)技术似乎提供了额外的安全/自动化。主流选择中,dom4j看起来不错,虽然还是有点冗长。它提供了一个“流利的接口(interface)”(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;
}

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

谢谢大家!

P.S.:Stephan Schmidt 在 Java MarkupBuilder 上工作,虽然好像还没有发布。

最佳答案

dom4j 或 jdom 可能是最优雅的,您可以根据自己的喜好编写代码。如果我记得的话,Dom4j 有构建器,是的,代码更冗长。

Element.addElement("x").setAttribute("x", "y").xxxxx;

关于java - 如何简洁地用 Java 构建 XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1020828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com