2012-01-18 17 views
6

Ricevo la seguente eccezione quando tento di ripristinare unmarshall XML nel codice java. Sembra che manchi la dichiarazione dello spazio dei nomi da qualche parte, ma non sono sicuro di dove.UnmarshalException - Namespace Issue?

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

Questo file è stato originariamente creato con un marshaller JAXB qui:

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

Ecco la parte superiore del file di schema:

<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> 

Ecco la parte superiore del file XML essere deselezionato:

<?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> 

Ecco la parte superiore del JAXB generato file di Java:

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

Ho provato ad aggiungere l'elemento dello spazio dei nomi per l'annotazione, ma non faceva differenza.

Ecco il contenuto del pacchetto-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; 

E infine ecco il codice deserializzazione:

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

Grazie-in-anticipo,

Guido

PS Sto usando Netbeans 7 per generare i binding.

+0

si può trovare il seguente utile: http: // blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html –

+0

@BlaiseDoughan - Ho inserito alcune informazioni in più sopra. Stai pensando che ho bisogno di aggiungere un "NamespacePrefixMapper?" –

+0

Non è necessario utilizzare 'NamespacePrefixMapper'. Sembra che il tuo documento di input non sia qualificato per lo spazio dei nomi. Com'è il tuo codice unmarshal? –

risposta

4

nel campione è necessario impostare il vostro DocumentBuilderFactory essere consapevoli dello spazio dei nomi:

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

Si potrebbe anche unmarshalling il ByteArrayInputStream direttamente:

unmarshaller.unmarshal(xmlStream); 
+1

Grazie mille per l'aiuto con questo. –