Подтвердить что ты не робот

Как быстро построить XML-документ в Java?

Мне нужно создать 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, хотя, похоже, не опубликовал его.

4b9b3361

Ответ 1

dom4j или jdom, вероятно, самые элегантные, вы можете написать код, как вам нравится. У Dom4j есть строители, если я помню, и да код более подробный.

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

Ответ 2

Взгляните на XOM. Это быстро, просто, правильно и не является подробным.

Ответ 3

Почему бы вам просто не использовать JAXB в любом случае... тогда проблема станет очень простым объектом для сопоставления объектов, и вы вообще избегаете xml.

Ответ 4

Хотя это не так лаконично, как строители в языках сценариев, StaxMate делает вещи очень простыми; как правило, так же просто, как и структурные модели, но дополнительно поддерживает типизированное добавление (неявные преобразования). И делает это все прямо в поток, что означает очень низкое использование памяти (и, если это имеет значение, высокая скорость).

Для чего он стоит, он также поддерживает свободный стиль (начиная с 2.0.x), поскольку он часто имеет смысл. Основным преимуществом по сравнению с решениями, связанными с полной привязкой данных (и древовидной моделью), является, пожалуй, использование низкой памяти; очень небольшое состояние сохраняется, все выходные отправляются в пункт назначения как можно скорее.

Ответ 5

Возможно, вы сможете рассмотреть JIBX, вы можете определить сопоставление из ваших классов модели домена в целевую XML-схему.

В качестве альтернативы, если это невозможно, хотя я знаю, что вы заявляете, что уклонились от использования технологий привязки, я бы посоветовал вам рассмотреть это решение, скопировав с вашей модели домена в сгенерированную модель, скорее всего, сделает более чистым, более поддерживаемый и менее подверженный ошибкам код, чем тот, который вы предлагаете (что также может сделать JIBX).

Я, наверное, должен добавить, по моему опыту, задавать вопросы о JIBX здесь бесплодны, но их список рассылки очень полезен.