JAXB 2.0 - Как пропустить обработку узлов и вернуть их в виде строки - PullRequest
2 голосов
/ 04 февраля 2010

Я обрабатываю документы XML с помощью JAXB 2.0, где мне нужна информация (в моем примере 'id'), сопоставленная с объектами Java, и выполняю некоторую бизнес-логику с помощью. Здесь все отлично работает.

Но эти XML-документы всегда содержат коллекцию из примерно 500 узлов, которые я просто хочу сохранить в базе данных в исходном формате xml, поэтому меня просто интересует XML в виде строки. По моему мнению, нет смысла демаршировать эти узлы в объекты Java, а затем снова их маршалировать в XML, чтобы сохранить их в базе данных.

Есть ли способ аннотировать свойство и заставить его просто хранить весь узел XML как строку? Вот моя текущая версия этого класса:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Parent {

    @XmlElement(name = "id")
    public long id;

    @XmlElement(name = "child", type = String.class)
    @XmlElementWrapper(name = "children")
    public List<String> children = new ArrayList<String>();

}

После демаршаллинга XML-документа children.size () возвращает правильное число childran, но они по-прежнему равны нулю.

XML-документ выглядит так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<parent>
    <id>45</id>
    <children>
        <child>
            <name>Crash Dummy</name>
            <age>21</age>
        </child>
        <child>
            <name>Rockstar Programmer</name>
            <age>12</age>
        </child>
    </children>
</parent>

Заранее благодарим за каждый совет или возможное решение.

1 Ответ

2 голосов
/ 04 февраля 2010

Нет, JAXB не разрешает что-то подобное (как и любой другой основанный на дереве XML API, о котором я знаю).

Я не верю, что издержки на разбор всего документа будут такими уж плохими. В конце концов, документ должен быть проанализирован в любом случае, чтобы выяснить, где начинается ваше статическое дерево узлов и где оно заканчивается. Хранение дерева узлов в виде узлов JAXB не намного хуже, чем хранение его в большом двоичном объекте.

Если производительность действительно так важна для вас, я бы предложил два варианта:

  • синтаксический анализ XML-документа с использованием более быстрого API, такого как StAX (правда, получить синтаксический анализатор с низкоуровневыми API-интерфейсами может быть очень сложно)
  • сохранить данные в виде двух файлов XML. Один содержит данные, которые вам действительно нужны, а другой содержит «статические» данные, которые вам просто необходимо носить с собой. В зависимости от того, что вы делаете с окончательным документом, может также использоваться что-то вроде XInclude.
...