JAXB - игнорировать элемент - PullRequest
29 голосов
/ 18 февраля 2011

Есть ли способ просто игнорировать элемент из анализа Jaxb? У меня большой XML-файл, и если бы я мог игнорировать один из больших и сложных элементов, он, вероятно, был бы проанализирован намного быстрее.

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

ex: это должно генерировать только Foo.element1 и Foo.element2

<foo>
    <element1>I want this</element1>
    <element2>And this</element2>
    <bar>
       <a>ALL of bar should be ignored</a>
       <b>this also should be ignored</b>
       <c>
           <x>a lot of C that take time to process</x>
       </c>
       <c>
            <x>a lot of C that take time to process</x>
       </c>
       <c>
          <x>a lot of C that take time to process</x>
       </c>
      <c>
          <x>a lot of C that take time to process</x>
      </c>
  </bar>
</foo>

Ответы [ 4 ]

38 голосов
/ 18 февраля 2011

Если ваша модель JAXB выглядит следующим образом:

@XmlRootElement(name="foo")
public class Foo {

   @XmlElement(name="element1")
   String element1;

   @XmlElement(name="element2")
   String element2;

   @XmlElement(name="bar")
   Bar bar;
}

, то простое удаление поля bar из Foo пропустит элемент <bar/> во входном документе.

Кроме того, поле помечается @XmlTransient вместо @XmlElement, и оно также будет пропущено.

12 голосов
/ 18 февраля 2011

JAXB будет игнорировать любые несопоставленные свойства.

Мудро для реализации (по крайней мере, в EcliseLink JAXB (MOXy) , которую я веду).Когда мы обрабатываем содержимое с помощью парсера SAX (т. Е. Вход был SAXSource), мы заменяем наш ContentHandler, который отвечает за построение объектов, на тот, который не обрабатывает этот раздел (org.eclipse.persistence.oxm.unmapped.UnmappedContentHandler).Когда мы используем обработку содержимого через анализатор StAX, мы просто переходим к следующему отображенному событию.

Если у вас есть свойство, соответствующее этому узлу, вы можете аннотировать его с помощью @ XmlTransient сделать его неотображенным свойством.

4 голосов
/ 03 января 2017

Все, что вам нужно, это пометить поле как @XmlTransient (аннотация @XmlTransient, которая должна скрывать поля, которые не являются обязательными). Пример ниже

JavaEE:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DeletedIds")
public class DeletedIds {

    @XmlElement(name = "DeletedId")
    private List<DeletedId> id;    

    @XmlTransient
    @XmlElement(name = "success")
    private String success;

    //getters&setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class DeletedId {

    private int id;

    //getters&setters
}

Xml:

<DeletedIds>
    <DeletedId>
        <id>1</id>
    </DeletedId>
    <DeletedId>
        <id>2</id>
    </DeletedId>
</DeletedIds>
1 голос
/ 18 февраля 2011

Вы должны использовать анализатор SAX и обработчик документов, который эффективно «пропускает» неинтересный узел.Вы не можете обойтись чтением байтов, но, по крайней мере, вы можете обойтись, потратив на них лишние ресурсы.

Если для вашего кода требуется дерево DOM, то вы в основном используете обработчик документов SAX, который генерирует узлы DOM,но "пропускает" неинтересные узлы.Определенно менее удобно, чем использование поставляемых генераторов дерева DOM, но достойный компромисс - вы не можете жить с дополнительными накладными расходами памяти нежелательных узлов, но вам нужно дерево DOM.

...