2013-04-05 7 views
5

Ich verwende derzeit JAXB zum Parsen von XML-Dateien. Ich habe die benötigten Klassen über eine xsd-Datei generiert. Die XML-Dateien, die ich erhalte, enthalten jedoch nicht alle Knoten, die in den generierten Klassen deklariert sind. Im Folgenden ist ein Beispiel für meine xml-Datei der Struktur:Umgang mit fehlenden Knoten mit JAXB

<root> 
<firstChild>12/12/2012</firstChild> 
<secondChild> 
<firstGrandChild> 
<Id> 
    </name> 
    <characteristics>Description</characteristics> 
    <code>12345</code> 
</Id> 
</firstGrandChild> 
</secondChild> 
</root> 

ich mit den folgenden beiden Fällen konfrontiert werde:

  1. Der Knoten <name> in den generierten Klassen vorhanden ist, aber nicht in den XML-Dateien
  2. Der Knoten hat keinen Wert.

In beiden Fällen wird der Wert auf null gesetzt. Ich möchte unterscheiden können, wenn der Knoten in der XML-Datei fehlt und wenn es vorhanden ist, aber einen Nullwert hat. Trotz meiner Recherchen habe ich keinen Weg gefunden, dies zu tun. Jede Hilfe ist mehr als willkommen

Vielen Dank im Voraus für Ihre Zeit und helfen

Grüße

+0

xsi: nil ist dein Freund! mehr hier lesen http://stackoverflow.com/questions/774192/what-is-the-correct-way-to-represent-null-xml-elements – MariuszS

+0

Dank für Ihre Antwort danken! So wie ich es verstanden habe, wird der Wert des Knotens auf "" statt auf Null gesetzt. Das Problem, mit dem ich konfrontiert bin, ist, dass für JAXB ein leerer Knoten und ein nicht existenter Knoten in der XML-Datei auf die gleiche Weise behandelt werden. So kann ich nicht wissen, ob ich den Knoten in der Datei erhalten habe oder ich tat, und sein Wert war null – user2249868

+0

Das folgende Beispiel wird mit 'xsi: nil' helfen: http://blog.bdoughan.com/2012/04/binding -to-json-xml-handling-null.html –

Antwort

3

Eine JAXB (JSR-222) Implementierung wird die Set-Methode für abwesende Knoten nicht nennen. Sie können Ihrer set-Methode Logik hinzufügen, um zu verfolgen, ob sie aufgerufen wurde oder nicht.

public class Foo { 

    private String bar; 
    private boolean barSet = false; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
     this.barSet = true; 
    } 

} 

UPDATE

JAXB auch leere Knoten als mit einem Wert von leeren String behandeln.

Java Modell

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Root { 

    private String foo; 
    private String bar; 

    public String getFoo() { 
     return foo; 
    } 

    public void setFoo(String foo) { 
     this.foo = foo; 
    } 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

} 

Demo

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum15839276/input.xml"); 
     Root root = (Root) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

input.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <foo></foo> 
</root> 
+0

Ich muss das gleiche für BigInteger-Datentyp und Sammlungen handhaben, aber für BigInteger ist das boolesche Flag immer falsch –