Мне нужно построить документ 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 и Джеймс Мёрти xmlbuilder .
Каковы более элегантные подходы для создания XML-документов в Java?
Резюме:
Джон Доу предложил dom4j и jdom .
CurtainDog рекомендовал использовать JAXB в любом случае, и jherico подсказал мне, что это было уместное предложение: вы могли бы затем использовать Dozer для сопоставления между моим текущим JavaBeans и JAXB JavaBeans.
thaggie рекомендует JIBX и соглашается с CurtainDog и jherico, что технологии связывания действительно практичны.
StaxMan рекомендует StaxMate .
Из вещей, на которые я смотрел, Practicalxml и 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 , хотя, похоже, не опубликовал его.