Ответ 1
dom4j или jdom, вероятно, самые элегантные, вы можете написать код, как вам нравится. У Dom4j есть строители, если я помню, и да код более подробный.
Element.addElement("x").setAttribute("x", "y").xxxxx;
Мне нужно создать 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, хотя, похоже, не опубликовал его.
dom4j или jdom, вероятно, самые элегантные, вы можете написать код, как вам нравится. У Dom4j есть строители, если я помню, и да код более подробный.
Element.addElement("x").setAttribute("x", "y").xxxxx;
Взгляните на XOM. Это быстро, просто, правильно и не является подробным.
Почему бы вам просто не использовать JAXB в любом случае... тогда проблема станет очень простым объектом для сопоставления объектов, и вы вообще избегаете xml.
Хотя это не так лаконично, как строители в языках сценариев, StaxMate делает вещи очень простыми; как правило, так же просто, как и структурные модели, но дополнительно поддерживает типизированное добавление (неявные преобразования). И делает это все прямо в поток, что означает очень низкое использование памяти (и, если это имеет значение, высокая скорость).
Для чего он стоит, он также поддерживает свободный стиль (начиная с 2.0.x), поскольку он часто имеет смысл. Основным преимуществом по сравнению с решениями, связанными с полной привязкой данных (и древовидной моделью), является, пожалуй, использование низкой памяти; очень небольшое состояние сохраняется, все выходные отправляются в пункт назначения как можно скорее.
Возможно, вы сможете рассмотреть JIBX, вы можете определить сопоставление из ваших классов модели домена в целевую XML-схему.
В качестве альтернативы, если это невозможно, хотя я знаю, что вы заявляете, что уклонились от использования технологий привязки, я бы посоветовал вам рассмотреть это решение, скопировав с вашей модели домена в сгенерированную модель, скорее всего, сделает более чистым, более поддерживаемый и менее подверженный ошибкам код, чем тот, который вы предлагаете (что также может сделать JIBX).
Я, наверное, должен добавить, по моему опыту, задавать вопросы о JIBX здесь бесплодны, но их список рассылки очень полезен.