web-dev-qa-db-fra.com

JAXB - Ignore element

Existe-t-il un moyen de simplement ignorer un élément de l'analyse syntaxique Jaxb? J'ai un fichier XML volumineux, et si je pouvais ignorer l'un des éléments volumineux et complexes, il serait probablement beaucoup plus rapide.

Ce serait encore mieux s'il ne pouvait même pas valider le contenu de l'élément et analyser le reste du document, même si cet élément n'était pas correct.

ex: cela ne devrait générer que Foo.element1 et 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>
28
questioner

En supposant que votre modèle JAXB ressemble à ceci:

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

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

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

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

ensuite, le simple fait de supprimer le champ bar de Foo ignorera l'élément <bar/> dans le document d'entrée.

Sinon, annotez le champ avec @XmlTransient au lieu de @XmlElement et il sera également ignoré.

38
skaffman

JAXB ignorera toutes les propriétés non mappées.

Mise en œuvre sage (au moins dans EcliseLink JAXB (MOXy) , que je dirige). Lorsque nous traitons le contenu via un analyseur SAX (c’est-à-dire qu’il s’agissait d’une source SAX), nous échangeons notre ContentHandler responsable de la création d’objets en un objet ne traitant pas cette section (org.Eclipse.persistence.oxm.unmapped. UnmappedContentHandler). Lorsque nous utilisons le traitement du contenu via un analyseur StAX, nous passons simplement à l'événement mappé suivant.

Si vous avez une propriété qui correspond à ce nœud, vous pouvez l'annoter avec @XmlTransient pour en faire une propriété non mappée.

12
Blaise Doughan

Tout ce dont vous avez besoin est son champ de marque comme @XmlTransient (annotation @XmlTransient qui devrait masquer les champs non requis) Exemple ci-dessous

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

Vous devez utiliser un analyseur SAX et un gestionnaire de documents qui "saute" le nœud de non-intérêt. Vous ne pouvez pas vous passer de lire les octets, mais vous pouvez au moins éviter de gaspiller des ressources supplémentaires.

Si votre code nécessite une arborescence DOM, vous utilisez en principe un gestionnaire de documents SAX qui génère des nœuds DOM, mais "ignore" les nœuds sans intérêt. C'est certainement moins pratique que d'utiliser les générateurs d'arborescence DOM fournis, mais un compromis acceptable est que vous ne pouvez pas supporter la surcharge de mémoire supplémentaire des nœuds indésirables, mais vous avez besoin de l'arborescence DOM.

1
Edwin Buck