JAXB Ignoriere zusätzliche Elemente aus Antwort-XML

8

Ich erhalte eine XML-Antwort und sie ändert sich sehr häufig (Knoten werden immer größer oder kleiner). Nach jeder Aktualisierung in Antwort-XML bricht mein Code ab, da meine zugeordnete Java-Klasse nicht alle Dateien enthält.

Gibt es eine Möglichkeit zu vermeiden, dass mein Code bricht, wenn Änderungen in Antwort-XML auftreten.

Jede Hilfe wird geschätzt.

Danke.

    
Arpit 02.09.2014, 10:52
quelle

2 Antworten

9

Um mit unbekannten Feldern fertig zu werden, können Sie eine List<Object> Eigenschaft annotiert @XmlAnyElement(lax=true)

hinzufügen %Vor%

Alle Elemente in der Eingabe, die nicht den expliziten Eigenschaften der Klasse entsprechen, werden in diese Liste übernommen. Wenn das Element dem JAXBContext bekannt ist, erhalten Sie das unmarshalierte Formular (die @XmlRootElement annotierte Klasse oder JAXBElement<Foo> ). Wenn das Element dem Kontext nicht bekannt ist, erhalten Sie org.w3c.dom.Element .

Ausführliche Informationen in Blaises Blog .

Für Knoten, die entfernt erhalten, sollten Sie in Ordnung sein, solange Sie Typen verwenden, die null sein können ( Integer anstatt int , Boolean und nicht boolean usw.) .

    
Ian Roberts 02.09.2014, 11:02
quelle
13

Verwenden Sie JAXB.unmarshal() , um einfach Java-Objekte aus XML zu erstellen.

Standardmäßig ist es sehr liberal.

Zitat aus dem javadoc :

  

Außerdem haben die Unmarshal-Methoden folgendes Merkmal:

     
  1. Die Schema-Validierung wird für die Eingabe-XML nicht ausgeführt. Die Verarbeitung wird versuchen, so weit wie möglich fortzufahren, auch wenn Fehler im XML vorhanden sind. Nur als letzter Ausweg schlägt diese Methode mit DataBindingException fehl.
  2.   

Also versucht JAXB.unmarshal() möglichst viele Daten von XML nach Java zu "transferieren" und es ist egal, ob es ein Java-Feld für ein XML-Element oder -Attribut gibt und es auch nicht Es ist wichtig, ob es ein Java-Feld gibt, für das es kein XML-Element oder -Attribut gibt.

Beispiel

Versuchen wir, den folgenden XML-Code auf eine Instanz von java.awt.Point zu entpacken:

%Vor%

Der Java-Code:

%Vor%

Wir haben JAXB.unmarshal() angewiesen, eine java.awt.Point -Instanz zu analysieren. Die Eingabe-XML enthält ein Element <y> , das mit Point.y abgeglichen werden kann, sodass int analysiert und auf Point.y gesetzt wurde. Für Point.x wurden keine XML-Daten gefunden, sodass sie nicht berührt wurden. Es gab keine Übereinstimmung für das Attribut hi und das XML-Element <peach> , daher wurden sie einfach nicht für irgendetwas verwendet.

Wir haben absolut kein Exception hier, und das Meiste, was möglich war, wurde geparst und von XML nach Java übertragen.

    
icza 02.09.2014 11:06
quelle

Tags und Links