2009-10-17 8 views
5

Grüße! Ich habe einen Server zurückkehr XML-Inhalte zu meinem Client, der wie folgt aussieht:JAXB zu unmarshall <string> foobar</string>

<string xmlns="...">foobar</string> 

Ich bin neu in JAXB und haben eine Menge Sachen arbeiten, es sei denn diese bekommen. Ich dachte, es wäre ziemlich einfach, dies zu einer Saite zu ordnen und zu entpacken. Es dauerte eine Weile, aber ich endlich herausgefunden, wie man dies Marschall als

public static String ToXML(String s) throws Exception 
    { 
     JAXBContext context = JAXBContext.newInstance(String.class); 
     Marshaller marshaller = context.createMarshaller(); 
     StringWriter sw = new StringWriter(); 
     marshaller.marshal(new JAXBElement(new QName("", "String"), String.class, s), sw); 

     return sw.toString(); 
    } 

Also meine Frage ist, wie ich entpacken das? Es kann nicht als Wurzelelement kommentiert werden. Ich kann java.lang nicht als Paket verwenden, um eine neue Instanz eines JAXBContext zu erstellen (ich bekomme eine ObjectFactory fehlende Ausnahme).

Jede Weisheit zu vermitteln? Das kann nicht so schwer sein, oder?

Antwort

3

Wenn Sie JAXB verwenden, müssen Sie den Code um ein XML-Schema herum erstellen. Das heißt, wenn Sie eine Datei haben, sagen Sie foo.xsd, müssen Sie sie über den xjc-Compiler ausführen (standardmäßig in JDK 6, ansonsten können Sie JAXB 2 herunterladen und verwenden). Dadurch wird das Schema gelesen und die Java-Bean und die zugehörigen ObjectFactory-Klassen mit den Elementen im Schema generiert. Die Java-Bean-Klassen sehen wie normale POJOs mit Anmerkungen aus. Die ObjectFactory-Klassen werden von der JAXB-Implementierung benötigt, um das XML in die entsprechende Java-Bean zu konvertieren. Dies erklärt Ihre fehlende ObjectFactory-Ausnahme.

So ist es nicht schwer, aber es gibt einige Beinarbeit beteiligt. Wir verwenden es für eine unserer Produktionsanwendungen und es ist großartig. Ich sehe mich jetzt mehr damit, dass es Teil des JDK ist.

+1

Ein XML-Schema ist mit JAXB völlig optional. Es ist vollkommen akzeptabel, Ihr eigenes Objektmodell manuell zu kommentieren. – skaffman

+0

Wahr, aber ein Schema-generierte Satz von Objekten gewährleistet die Korrektheit im Dokument (das Dokument kann anhand des Schemas validiert werden) und die Java-Objekte (es ist leicht, ein Feld zu übersehen). Sie können den Prozess auch über mehrere Anwendungen und Maschinen hinweg wiederholen. –

10

Sie müssen ein Objektmodell schreiben, das Ihrer XML-Struktur entspricht, und JAXB mitteilen, dass es darauf unmarshalen soll. Ihr Beispiel mag einfach aussehen, aber dafür ist JAXB nicht.

versuchen, etwas wie folgt aus:

@XmlRootElement(name="string", namespace="blah") 
public class MyString { 
    @XmlValue 
    String value; 
} 

JAXBContext context = JAXBContext.newInstance(MyString.class); 
MyString myString = (MyString) context.createUnmarshaller().unmarshal(...); 

Dies wird die XML <string xmlns="blah">foobar</string> entpacken. Ändern Sie den Namespace entsprechend. Wenn Sie viele Namespaces haben, ist JAXB nicht wirklich das Werkzeug für Sie.

7

Ich war davon überrascht, aber die folgende scheint zu funktionieren:

final String xmlString = "<string>value</string>"; 
final StringReader xmlReader = new StringReader(xmlString); 
final StreamSource xmlSource = new StreamSource(xmlReader); 
final JAXBContext jaxbContext = JAXBContext.newInstance(String.class); 
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
final String stringValue = unmarshaller.unmarshal(xmlSource, String.class).getValue(); 

Ist das, was Sie suchen?