Самый быстрый и эффективный способ создания XML - PullRequest
9 голосов
/ 28 января 2012

Какой самый быстрый и эффективный способ создания XML-документов в Java? Существует множество библиотек (woodstox, xom, xstream ...), просто интересно, есть ли у кого-нибудь какие-либо вклады. Должен ли я пойти с подходом генерации кода (так как схема XML хорошо известна)? Или подход отражения во время выполнения?

Отредактировано с Дополнительная информация:

  1. Хорошо определенная XML-схема доступна и редко изменяется
  2. Требуется преобразовать Java-объект в XML, а не наоборот
  3. Тысячи Java-объектов в XML в секунду
  4. Генерация кода, сложность кода, конфигурация, обслуживание и т. Д. Являются вторыми после более высокой производительности.

Ответы [ 5 ]

14 голосов
/ 28 января 2012

Если бы я должен был создать очень простой XML-контент , я бы придерживался только API JDK, не вводя никаких сторонних зависимостей.

Так что для простого XML и если бы я был сопоставить файл XML с классами Java (или наоборот), я бы выбрал JAXB . См. Этот учебник , чтобы увидеть, насколько это просто.

Сейчас.

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

И наконец.

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

Надеюсь, теперь вы понимаете, что у вас есть много возможностей - выберите лучший вариант для ваших нужд:)

И получайте удовольствие!

5 голосов
/ 13 октября 2013

Попробуйте Xembly , небольшую библиотеку с открытым исходным кодом, которая делает этот процесс создания XML очень простым и интуитивно понятным:

String xml = new Xembler(
  new Directives()
    .add("root")
    .add("order")
    .attr("id", "553")
    .set("$140.00")
).xml();

Xembly - это оболочка для нативного Java DOM, и оченьлегкая библиотека (я разработчик).

2 голосов
/ 29 января 2012

Во-первых, важно, чтобы сериализация была правильной. Рукописные сериализаторы обычно нет. Например, они склонны забывать, что строка "]]>" не может появиться в текстовом узле.

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

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

Кроме того, некоторые библиотеки общего назначения могут проверять правильность написанного вами, например, проверять, объявлены ли префиксы пространства имен (или объявлять их, если нет). Вы можете сделать это быстрее, если он не проверяет. С другой стороны, вы можете создать библиотеку, которая будет быстрой, но свинья для работы. Ставить производительность выше всех других целей - это почти всегда ошибка.

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

1 голос
/ 26 декабря 2014

Самый хороший способ, который я знаю, - использовать движок XPath, способный создавать узлы XMLBeam может сделать это (в тесте JUnit здесь):

    public interface Projection {

    @XBWrite("/create/some/xml/structure[@even='with Predicates']")
    void demo(String value);
}

@Test
public void demo() {
    Projection projection = new XBProjector(Flags.TO_STRING_RENDERS_XML).projectEmptyDocument(Projection.class);
    projection.demo("Some value");
    System.out.println(projection);
 }

Эта программа печатает:

<create>
   <some>
      <xml>
        <structure even="with Predicates">Some value</structure>
      </xml>
   </some>
</create>
0 голосов
/ 14 января 2019

Использовать XMLStreamWriter.

Я запустил микробенчмарк, сериализовавший миллион из них:

@XmlRootElement(name = "Root")
public class Root {
    @XmlAttribute
    public String attr;
    @XmlElement(name = "F1")
    public String f1;
    @XmlElement(name = "F2")
    public String f2;
}

со следующими результатами:

JAXB: 3464 millis (<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Root attr="at999999"><F1>x999999</F1><F2>y999999</F2></Root>)
XMLStreamWriter: 1604 millis (<?xml version="1.0" ?><Root attr="at999999"><F1>x999999</F1><F2>y999999</F2></Root>)
Xembly: 25832 millis (<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root attr="at999999">
<F1>x999999</F1>
<F2>y999999</F2>
</Root>
)
StringBuilder: 60 millis (<?xml version="1.0" encoding="UTF-8"><Root attr=")at999999"><F1>x999999</F1><F2>y999999</F2></Root>)
StringBuilder w/escaping: 3806 millis (<?xml version="1.0" encoding="UTF-8"><Root attr="at999999"><F1>x999999</F1><F2>y999999</F2></Root>)

который дает:

  • StringBuilder: 60 мс
  • XMLStreamWriter: 1604 мс
  • JAXB: 3464 мс
  • StringBuilder с очень примитивным выходом: 3806мс
  • Xembly: 25832 мс
  • и многие другие, которые я не пробовал

StringBuilder является наиболее эффективным, но это потому, что ему не нужнопросмотреть весь текст в поисках ", &, <и> и преобразовать их в объекты XML.

...