Рекомендации и рекомендации по разработке XML с Java?

Несколько раз я сталкиваюсь с задачей, требующей создания XML (сравнительно небольшого размера). И каждый раз я блуждаю:

Каковы наилучшие методы создания XML-документа динамически, в отношении простоты кодирования, удобочитаемости и ремонтопригодности кода, производительности и хороших методов проектирования?

Например:

  • лучше ли конкатенировать строки или создать дерево DOM и заполнить его?
  • лучше ( "процедурно" ), следовательно, свертывать линии, строящие XML, или иметь многочисленные методы обработки своей части документа?
  • лучше ли иметь основу XML, сгенерированного с помощью инструмента (который?) или каждый раз начинать с нуля?

Буду признателен, если бы вы могли поделиться ссылкой, есть ли известная тема на эту тему?

Ответ 1

лучше ли конкатенировать строки или создать дерево DOM и заполнить его?

XML намного сложнее, чем кажется. Не создавайте его, конкатенируя строки. Вы должны использовать StAX javax.xml.stream.XMLStreamWriter при создании документа "на лету". Это вполне разумно с точки зрения использования памяти, даже для больших документов.

Для небольших документов возможно создание дерева DOM, но я предпочитаю XMLStreamWriter при приближении к XML.

Для небольших документов вы также можете использовать фреймворк привязки XML, такой как JAXB, который фактически совпадает с построением дерева DOM, но позволяет вам напишите свой код с точки зрения бизнес-домена, а не с точки зрения XML. В качестве бонуса вы можете использовать те же аннотации JAXB с Джерси, чтобы генерировать выходные данные JSON, а также XML.

лучше ( "процедурно" ), следовательно, свертывать линии, строящие XML, или иметь многочисленные методы обработки своей части документа?

Это контекстуально; ваша цель должна заключаться в том, чтобы максимально разборчивость исходного кода. Повторение разделов в вашей XML-структуре имеет тенденцию использовать свои собственные методы. Длинные, плоские разделы XML имеют тенденцию делать длинные процедурные Java-методы.

Некоторые необычные отступы могут сделать код более читаемым:

private void write(XMLStreamWriter w) {
    //...
    w.writeStartElement("parentTag");
        w.writeStartElement("nestedTag"); 
        w.writeCharacters("body 1");
        w.writeEndElement(); 
    w.writeEndElement();
}

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

лучше ли иметь основу XML, сгенерированного с помощью инструмента (который?) или каждый раз начинать с нуля?

С подходом XMLStreamWriter или с инфраструктурой привязки, такой как JAXB, я не вижу необходимости использовать систему шаблонов или что-то в этом роде. Эти рамки отлично умеют писать преамбулу <?xml version="1.0"?>.

Если вам нужно вставить очень маленький бит сгенерированного XML в более крупный статический шаблон, вы можете использовать предварительно сгенерированную структуру. Я думаю, что это краевой случай; или fwiw, я никогда не видел, чтобы это случилось.

Ответ 2

JAXB

Высокий уровень построения XML-документа, но нелегкий для изучения (по сравнению с, например, DOM API); все же, это хорошая инвестиция, изучите ее один раз и используйте много раз -— в Интернете есть много советов.

Вы используете сеттеры для создания XML-документа, а затем сериализуете в String. Код чист и понятен. Это приносит вам пользу, если XML особенно сложный.

DOM API

Для сложного XML, как правило, создается код спагетти, с большим количеством жестко закодированных строк, может быть кошмаром для управления. Если ваши XML файлы не очень простые, не очень хороший выбор.

Строка-склейки

ЗАПРЕЩАЕТСЯ. В XML есть много подводных камней, которые вы не собираетесь покрывать, например, решение объектов, элементы, содержащие CDATA или другие элементы, пространства имен. Вы легко закончите полный беспорядок в своем коде, с большим количеством вложенных "ifs" для еще одного-особого случая.

Пример реальной жизни: однажды мне пришлось анализировать XML, созданный приложением А в новом приложении C. До тех пор единственным потребителем этого XML было приложение B. Оба A и B были написаны одним автором и использовали String- склеенный XML. Когда я анализировал XML в C, он оказался даже не корректным из-за ошибок копирования-вставки в и B — Мне пришлось прорыть много 10-летнего кода там, чтобы исправить все возможные ошибки.

Ответ 3

У вас есть несколько вариантов, открытых для вас... однако, как правило, я избегаю конкатенации строк, если вы не создаете действительно * очень маленький XML-документ (скажем, 3 строки или около того) поскольку имеющиеся инструменты действительно облегчают жизнь с точки зрения разработки и обслуживания.

Ниже представлены мои личные фавориты:

Если вы используете Java 6+, вы можете использовать включенный JAXB (Java API для привязки XML), который позволяет просто добавлять аннотации к POJO, а когда вам нужен XML, пара строк кода будет создавать это для вас! Это также работает при работе с крупными объектными структурами, включая коллекции и т.д. Java.net JAXB Tutorial может служить хорошей отправной точкой.

По большей части мое использование JAXB было с достаточно большими, хотя и довольно просто структурированными XML-документами, поэтому мне не приходилось писать какие-либо расширения, поэтому я не могу комментировать его с этого аспекта.

Прежде чем перейти на Java 6, я использовал JDOM, который был (и до сих пор является) превосходной библиотекой для создания XML, Библиотека

Ответ 4

Это зависит от вашего прецедента, насколько важна производительность или функции для того, что вам нужно? Для Java 6 и выше, синтаксический анализатор Stax, по-видимому, является рекомендуемым выбором и тем, что я использую для некоторой текущей работы.

DOM API хорош для небольших документов или тех, которые содержат более тысячи элементов. Поскольку DOM создает дерево ваших XML-данных, оно идеально подходит для редактирования структуры вашего XML-документа путем добавления или удаления элементов. Позволяет перемещаться по всему документу, но все это загружается в память.

SAX API - самый легкий из API. Он идеально подходит для синтаксического анализа мелких документов (документов, которые не содержат много вложенности элементов) с уникальными именами элементов. SAX использует структуру обратного вызова; это означает, что программисты обрабатывают события синтаксического анализа, поскольку API читает XML-документ, что является относительно эффективным и быстрым способом анализа. Это только чтение, и вы не можете писать в xml с ним.

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

API StAX также лучше всего, если вы планируете передать весь XML-документ в качестве параметра; проще передать входной поток, чем передавать события SAX. Наконец, StAX API был разработан для использования при привязке данных XML к объектам Java, и вы можете изменить xml, в отличие от анализатора SAX.

Вот Список функций XML Parser. Мне показалось, что это интересно.

XML Parser Features

Это хорошая статья о Тесты производительности Parser Performance. Вот резюме:

  • Если вы ищете производительность (например, скорость разметки XML), выберите JAXB
  • Если вы ищете использование с низкой памятью (и готовы пожертвовать некоторой скоростью), используйте STax.