2009-10-17 11 views
5

Pozdrowienia! Mam serwera powrocie zawartość XML do mojego klienta, który wygląda tak:JAXB do unmarshall <string> foobar</string>

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

Jestem nowy JAXB i zdobyć wiele rzeczy roboczy, z wyjątkiem tego. Sądziłem, że łatwo będzie je wymusić i wydobyć z tego sznurka. Zajęło to trochę czasu, ale w końcu zorientowali się, jak zebrać to jako

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(); 
    } 

Więc moje pytanie jest, jak ja unmarshal to? Nie można go adnotować jako elementu głównego. Nie mogę użyć java.lang jako pakietu do utworzenia nowej instancji JAXBContext (otrzymuję brakujący obiekt ObjectFactory).

Każda mądrość do przekazania? To nie może być takie trudne, prawda?

Odpowiedz

3

Kiedy używasz JAXB, musisz zbudować kod wokół schematu XML. Oznacza to, że jeśli masz plik, na przykład foo.xsd, musisz go uruchomić przez kompilator XJC (domyślnie w JDK 6, w przeciwnym razie możesz pobrać JAXB 2 i użyć tego). To odczyta schemat i wygeneruje komponent bean ObjectFactory oraz powiązane klasy ObjectFactory z elementami w schemacie. Klasy komponentu Java będą wyglądały jak zwykłe obiekty POJO z adnotacjami. Klasy ObjectFactory są potrzebne w implementacji JAXB do konwersji XML do odpowiedniego komponentu Java bean. To wyjaśnia Twój brakujący wyjątek ObjectFactory.

Nie jest to trudne, ale wiąże się to z pracą z nogą. Używamy go do jednej z naszych aplikacji produkcyjnych i jest świetny. Widzę, że używam go teraz, ponieważ jest częścią JDK.

+1

Schemat XML jest całkowicie opcjonalny dla JAXB. Całkowicie dopuszczalne jest ręczne dodawanie adnotacji do własnego modelu obiektu. – skaffman

+0

To prawda, ale posiadanie zestawu obiektów generowanego przez schemat zapewnia poprawność w dokumencie (dokument można sprawdzić na podstawie schematu) oraz obiekty Java (łatwo jest ominąć pole). Możesz powtórzyć proces w wielu aplikacjach i maszynach. –

10

Musisz napisać model obiektu, który jest zgodny ze strukturą XML, i powiedzieć JAXB, aby nie był do tego odporny. Twój przykład może wyglądać prosto, ale to nie jest to, na co JAXB jest.

spróbować czegoś takiego:

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

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

Będzie unmarshal XML <string xmlns="blah">foobar</string>. Zmień odpowiednio przestrzeń nazw. Jeśli masz wiele przestrzeni nazw, to JAXB nie jest tak naprawdę narzędziem dla ciebie.

7

byłem zaskoczony tym, ale dodaje wydaje się działać:

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(); 

Czy tego szukałeś?