2013-04-05 23 views
5

Obecnie używam JAXB do parsowania plików xml. Wygenerowałem klasy wymagane przez plik xsd. Jednak otrzymane pliki xml nie zawierają wszystkich węzłów zadeklarowanych w wygenerowanych klasach. Poniżej znajduje się przykład struktury mój plik XML:Obsługa brakujących węzłów za pomocą JAXB

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

mam do czynienia z dwóch następujących przypadkach:

  1. Węzeł <name> jest obecny w generowanych klas, ale nie w plikach XML
  2. Węzeł nie ma wartości

W obu przypadkach wartość jest ustawiona na wartość null. Chciałbym móc odróżnić, gdy węzeł jest nieobecny w pliku XML i gdy jest obecny, ale ma wartość null. Pomimo moich poszukiwań, nie znalazłem sposobu, aby to zrobić. Każda pomoc jest więcej niż mile widziane

Dziękuję z góry za poświęcony czas i pomoc

Pozdrowienia

+0

xsi: nil jest twoim przyjacielem! Czytaj więcej tutaj http://stackoverflow.com/questions/774192/what-is-the-correct-way-to-represent-null-xml-elements – MariuszS

+0

Dziękuję za odpowiedź! Jak rozumiem, chodzi o ustawienie wartości węzła na "" zamiast wartości zerowej. Problem, przed którym stoję, polega na tym, że dla JAXB, pusty węzeł i nieoczekiwany węzeł w pliku xml są obsługiwane w ten sam sposób. Tak więc nie wiem, czy otrzymałem węzeł w pliku, czy też zrobiłem i jego wartość była zerowa – user2249868

+0

Poniższy przykład pomoże w 'xsi: nil': http://blog.bdoughan.com/2012/04/binding -to-json-xml-handling-null.html –

Odpowiedz

3

Implementacja JAXB (JSR-222) nie będzie wywoływać metody określonej dla nieobecnych węzłów. Możesz umieścić logikę w swojej ustawionej metodzie, aby śledzić, czy została ona wywołana.

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 również traktować jako węzły pustych o wartości pustej String.

Java model

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

Potrzebuję obsługiwać to samo dla typu danych BigInteger i kolekcji, ale dla BigInteger flaga boolean jest zawsze fałszywa –

Powiązane problemy