2012-01-18 9 views
6

Otrzymuję następujący wyjątek, gdy próbuję usunąć XML z powrotem do kodu Java. Wygląda na to, że brakuje mi gdzieś deklaracji przestrzeni nazw, ale nie jestem pewien, gdzie.UnmarshalException - Problem z przestrzenią nazw?

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"wg_provider"). 
Expected elements are <{http://www.warriorgateway.org/WGProvider.xsd}wg_provider> 

Ten plik został pierwotnie stworzony z naziemnego JAXB tutaj:

JAXBContext providerContext = JAXBContext.newInstance(WgProvider.class); 
    Marshaller providerMarshaller = providerContext.createMarshaller(); 
    providerMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    StringWriter providerWriter = new StringWriter(); 
    providerMarshaller.marshal(provider, providerWriter); 

Oto top pliku schematu:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.warriorgateway.org/WGProvider.xsd" 
    xmlns:ns1="http://www.warriorgateway.org/WGProvider.xsd" 
    elementFormDefault="qualified"> 

    <xsd:element name="wg_provider"> 
     <xsd:complexType> 

Oto top pliku XML do wyodrębnienia:

<?xml version="1.0" encoding="UTF-8"?> 
<wg_provider xmlns="http://www.warriorgateway.org/WGProvider.xsd"> 
    <ein>26-0081701</ein> 
    <name>MOMS CLUB</name> 
    <is_virtual>false</is_virtual> 
    <description> 
</description> 

Oto szczyt JAXB wygenerowany plik Java:

@XmlRootElement(name = "wg_provider") 
public class WgProvider { 

Próbowałem dodanie elementu przestrzeni nazw do adnotacji, ale to nie miało znaczenia.

Oto treść pakiet-info.xml:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.warriorgateway.org/WGProvider.xsd", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package org.warriorgateway.api.model.wg; 

I wreszcie oto kod unmarshalling:

for (String wrappedProviderXML : wrappedProviderXMLList) { 

    DocumentBuilderFactory documentbuilderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder documentbuilder = documentbuilderFactory.newDocumentBuilder(); 
    ByteArrayInputStream xmlStream = new ByteArrayInputStream(wrappedProviderXML.getBytes()); 
    Document providerXMLDocument = documentbuilder.parse(xmlStream); 

    JAXBContext wgProviderContext; 
    try { 
     wgProviderContext = JAXBContext.newInstance(WgProvider.class); 
     Unmarshaller wgProviderUnmarshaller = wgProviderContext.createUnmarshaller(); 

     WgProvider wgProvider = (WgProvider) wgProviderUnmarshaller.unmarshal(providerXMLDocument); 
    } catch (JAXBException ex) { 
     Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Thanks-w-góry

Guido

PS Używam Netbeans 7 do generowania powiązań.

+0

może się okazać przydatny następujący: http: // blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html –

+0

@BlaiseDoughan - Podałem trochę więcej informacji powyżej. Czy myślisz, że muszę dodać "NamespacePrefixMapper?" –

+0

Nie musisz używać 'NamespacePrefixMapper'. Wygląda na to, że twój dokument wejściowy nie jest kwalifikowany do przestrzeni nazw. Jak wygląda Twój niepoprawny kod? –

Odpowiedz

4

W swojej próbie trzeba ustawić DocumentBuilderFactory być świadomy nazw:

DocumentBuilderFactory documentbuilderFactory = DocumentBuilderFactory.newInstance(); 
documentbuilderFactory.setNamespaceAware(true); 

Można również unmarshal się ByteArrayInputStream bezpośrednio:

unmarshaller.unmarshal(xmlStream); 
+1

Bardzo dziękuję za pomoc w tej sprawie. –