Мне нужно создать XML-документ из иерархии объектов Java. Исправлены как классы Java, так и формат XML. Поэтому я не могу использовать XML-сериализатор, например XStream: он основывает XML-формат на Java-классах. Аналогично, технология привязки Java XML, такая как JAXB, не будет работать, поскольку она создает классы Java из схемы XML [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. Кажется, что есть некоторые новые XML-сборщики для Java, такие как practicalxml и James Murty xmlbuilder.
Каковы более элегантные подходы для создания XML-документов в Java?
Резюме:
Джон До предложил dom4j и jdom.
CurtainDog в любом случае рекомендовал использовать JAXB, и jherico признал меня, что это было предвестником: вы могли бы использовать Dozer для сопоставления между моими текущими JavaBeans и JAXB JavaBeans.
thaggie рекомендует JIBX и согласился с CurtainDog и jherico, что технологии привязки фактически практичны.
StaxMan рекомендует StaxMate.
Из всего, на что я смотрел, практические xml и 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.: Стефан Шмидт работал над Java MarkupBuilder, хотя, похоже, не опубликовал его.