Рекомендации и рекомендации по разработке 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.