Пользовательский Java XMLBuilder vs Стандартный на основе классов - PullRequest
5 голосов
/ 10 декабря 2010

Какое наилучшее решение для генерации XML.

Моя цель - создать несколько простых XML-файлов из кода. Я собираюсь реализовать простую пользовательскую реализацию XML Builder на основе StringBuffer. С другой стороны, есть несколько библиотек, таких как http://code.google.com/p/java-xmlbuilder/ и http://code.google.com/p/xmltool/, которые имеют хороший DSL, но я думаю, что не хватает производительности.

Поскольку моя цель - собрать достаточно простой XMLBuilder с высокой производительностью, я думаю, что я создам собственное решение. Будет показано:

  • Хороший DSL на основе Java для конструкций XML (в основном, с добавлением тегов)
  • Отличная производительность на основе StringBuffer.
  • Обработка экранирования строковых данных при добавлении тегов XML.
  • Автоматический отступ

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

ОБНОВЛЕНИЕ. Почему я думаю, что производительность стандартных сборщиков XML не очень хорошая.

Стандартные сборщики XML используют Document Builder Factory и работают с классами за кулисами. Также эти классы оптимизированы под все пользователи. Например, мне не нужна поддержка пространства имен и т. Д.

<?xml version="1.0" encoding="utf-8">
<root>
 <testdata>value</testdata>
</root>
</xml>

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

ОБНОВЛЕНИЕ 2 . Требование к производительности состоит в том, что код должен делать столько вещей, сколько требуется для генерации простого XML, а не больше.

ОБНОВЛЕНИЕ 3. Спасибо всем за отличные комментарии! Теперь я лучше понимаю, что мне нужно, и что моя первоначальная цель была поставлена ​​неправильно со словом «производительность». Моя истинная цель - использовать достаточно простое решение с удобным DSL для описания структуры XML и генерирования вывода XML.

Я буду использовать простые объекты Java в качестве DSL для XML и генерировать XML с использованием библиотеки XStream, что является довольно простым решением.

ОБНОВЛЕНИЕ 4. JAXB. Я обсуждал XStream против JAXB и обнаружил, что JAXB работает быстрее, чем XStream. Кроме того, я уже использую JAXB в своем проекте, и мне нравятся его стандартные аннотации. Я передумал и сейчас буду работать с JAXB, потому что XStream изначально был сильно развит в то время, когда JAXB был не так хорош, как сегодня.

Ответы [ 4 ]

4 голосов
/ 10 декабря 2010

я предложу что-то очень спорный, но все-таки ...

1002 * Сделайте профилирование и эксплуатационные испытания с обеих библиотек. 1006 * Если у вас нет времени для этогопредполагать, что что-то медленное, было бы неправильным выбором, по моему мнению.Потому что, если окажется, что он на самом деле не медленный, это сэкономит вам много времени на использование уже созданной и поддерживаемой библиотеки / фреймворка.

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

3 голосов
/ 10 декабря 2010

Относительно:

Стандартные сборщики XML используют Document Строитель фабрики и работает с классами за кулисами. Также эти классы оптимизирован для всех пользователей. За пример мне не нужна поддержка пространства имен и т.д.

Альтернативой DOM является StAX ( JSR-173 ). Это потоковый API для XML, который довольно быстрый. Существует несколько реализаций, которые я считаю Woodstox достаточно производительными.

2 голосов
/ 10 декабря 2010

Существует мощный и гибкий NodeBuilder Groovy (http://groovy.codehaus.org/GroovyMarkup).

def root = new NodeBuilder()
  .people(kind:'folks', groovy:true) {
    person(x:123,  name:'James', cheese:'edam') {
      project(name:'groovy')
      project(name:'geronimo')
    }
    person(x:234,  name:'bob', cheese:'cheddar') {
      project(name:'groovy')
      project(name:'drools')
    }
  }
XmlUtil.serialize(root, System.out)

В результате получается документ XML:

<?xml version="1.0" encoding="UTF-8"?>
<people kind="folks" groovy="true">
  <person x="123" name="James" cheese="edam">
    <project name="groovy"/>
    <project name="geronimo"/>
  </person>
  <person x="234" name="bob" cheese="cheddar">
    <project name="groovy"/>
    <project name="drools"/>
  </person>
</people>
1 голос
/ 22 декабря 2010

Еще одно высокопроизводительное предложение: используйте StaxMate - это так же быстро, как и базовый XML-модуль записи на основе Stax, который довольно быстр (40 - 80 мегабайт в секунду, поддерживается).Просто убедитесь, что вы НЕ используете стандартную реализацию JDK 6 Stax (Sun sjsxp), а что-то более быстрое, например, Woodstox или Aalto.

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

Но если вы действительно хотите сделать что-то помимо существующих авторов, вы можете рассмотреть возможность использованияпростой писатель и расширение его с дополнительными функциями, которые вам нужны.Например, если вы просто используете Stax XMLStreamWriter в качестве базы, довольно просто добавить простые, но эффективные абстракции.Или, если вам нравятся существующие пакеты, посмотрите, можете ли вы предложить усовершенствования их авторам (или даже вклады в код).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...