Вопрос

Мне нужно создать XML-документ из иерархии объектов Java.Как классы Java, так и формат XML являются фиксированными.Поэтому я не могу использовать XML-сериализатор, например XStream - поток:он основывает формат XML на классах Java.Аналогично, технология привязки Java XML, такая как ДЖАКСБ не будет работать, так как он создает классы Java из XML-схемы [ed:но смотрите ниже].Мне нужен ручной подход.

Низкотехнологичный маршрут StringBuilder приводит к хрупкому и глючному коду (по крайней мере, для меня!).

API, подобный ДЖАКСП или ДЖДОМ это приводит к гораздо более надежному коду, но он довольно подробный.

Заводной обладает элегантным 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')
  }
}

Другие языки (напр. Рубин) есть еще лучшие, хотя я хочу остаться с чистой Java.Похоже, действительно существуют некоторые новые XML-конструкторы для Java, такие как практический xml и Джеймса Мерти xmlbuilder - разработчик.

Каковы более элегантные подходы к созданию XML-документов на Java?

Краткие сведения:

Предложил Джон Доу dom4j и дждом.

CurtainDog в любом случае рекомендовал использовать JAXB, и джерико дал мне понять, что это уместное предложение:затем вы могли бы использовать Dozer для сопоставления между моими текущими JavaBeans и JavaBeans JAXB.

тэгги рекомендует ДЖИБКС и согласился с CurtainDog и джерико в том, что технологии привязки действительно практичны.

Стаксман рекомендует Стаксмейт.

Из того, что я просмотрел, 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 ( Разметчик), хотя, похоже, он этого не публиковал.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Возможно, вы сможете рассмотреть ДЖИБКС, возможно , вы сможете определить отображение от ваших классов модели домена к вашей целевой XML-схеме.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top