Подтвердить что ты не робот

JAXB - Игнорировать элемент

Можно ли просто игнорировать элемент из разбора 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>
4b9b3361

Ответ 1

Предполагая, что ваша модель 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, и оно также будет пропущено.

Ответ 2

JAXB игнорирует любые неотображаемые свойства.

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

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

Ответ 3

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

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

Ответ 4

Все, что вам нужно, пометьте поле как @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>