web-dev-qa-db-ger.com

JAXB - Element ignorieren

Gibt es eine Möglichkeit, ein Element aus dem Jaxb-Parsen einfach zu ignorieren? Ich habe eine große XML-Datei, und wenn ich eines der großen, komplexen Elemente ignorieren könnte, würde es wahrscheinlich viel schneller analysiert werden.

Es wäre sogar noch besser, wenn der Inhalt des Elements überhaupt nicht überprüft und der Rest des Dokuments analysiert werden könnte, selbst wenn das Element nicht korrekt ist.

beispiel: Dies sollte nur Foo.element1 und Foo.element2 generieren

<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>
28
questioner

Angenommen, Ihr JAXB-Modell sieht folgendermaßen aus:

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

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

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

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

wenn Sie einfach das Feld bar aus Foo entfernen, wird das Element <bar/> im Eingabedokument übersprungen.

Alternativ können Sie das Feld mit @XmlTransient anstelle von @XmlElement versehen und es wird auch übersprungen.

38
skaffman

JAXB ignoriert alle nicht zugeordneten Eigenschaften.

Implementierungsweise (zumindest in EcliseLink JAXB (MOXy) , die ich führe). Wenn wir den Inhalt über einen SAX-Parser verarbeiten (dh die Eingabe war eine SAXSource), tauschen wir unseren ContentHandler aus, der für das Erstellen von Objekten zuständig ist, und zwar für einen, der für diesen Abschnitt keine Verarbeitung durchführt (org.Eclipse.persistence.oxm.unmapped). UnmappedContentHandler). Wenn wir die Inhalte über einen StAX-Parser verarbeiten, gelangen wir einfach zum nächsten zugeordneten Ereignis.

Wenn Sie eine Eigenschaft haben, die diesem Knoten entspricht, können Sie sie mit @XmlTransient versehen, um eine nicht zugeordnete Eigenschaft zu erhalten.

12
Blaise Doughan

Alles, was Sie brauchen, ist ein Feld als @XmlTransient (Annotation @XmlTransient, das Felder ausblenden soll, die nicht benötigt werden). Beispiel unten

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>
3
Yahor M

Sie müssen einen SAX-Parser und einen Document-Handler verwenden, der den nicht interessierenden Knoten effektiv "überspringt". Sie können die Bytes nicht lesen, aber zumindest können Sie damit umgehen, dass sie zusätzliche Ressourcen verschwenden.

Wenn für Ihren Code eine DOM-Struktur erforderlich ist, verwenden Sie grundsätzlich einen SAX-Dokumenthandler, der DOM-Knoten generiert, die nicht interessierenden Knoten jedoch "überspringt". Auf jeden Fall weniger bequem als die mitgelieferten DOM-Baumgeneratoren, aber ein anständiger Kompromiss ist, dass Sie nicht mit dem zusätzlichen Speicheraufwand der unerwünschten Knoten leben können, sondern den DOM-Baum benötigen.

1
Edwin Buck