2012-01-18 20 views
6

Obtengo la siguiente excepción cuando intento deshacer XML de nuevo en código java. Parece que me falta la declaración del espacio de nombres en alguna parte, pero no estoy seguro de dónde.UnmarshalException - Espacio de nombres ¿Cuestión?

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

Este archivo se creó originalmente con un contador de referencias JAXB aquí:

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

Aquí está la parte superior del archivo de esquema:

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

Aquí está el la parte superior del archivo XML para ser desmaterializado:

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

Aquí está la parte superior de la JAXB genera archivo Java:

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

He intentado añadir el elemento de espacio de nombres a la anotación, pero no había ninguna diferencia.

Aquí está el contenido del paquete-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; 

Y finalmente aquí está el código 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); 
    } 

Gracias-in-advance,

Guido

PD Estoy usando Netbeans 7 para generar los enlaces.

+0

Usted puede encontrar los siguientes útiles: http: // blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html –

+0

@BlaiseDoughan - Puse un poco más de información arriba. ¿Estás pensando que necesito agregar un "NamespacePrefixMapper"? –

+0

No es necesario que use 'NamespacePrefixMapper'. Parece como si su documento de entrada no estuviera calificado para el espacio de nombres. ¿Cómo se ve tu código unmarshal? –

Respuesta

4

En la muestra se debe configurar su espacio de nombres DocumentBuilderFactory ser conscientes:

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

También puede deserializar el ByteArrayInputStream directamente:

unmarshaller.unmarshal(xmlStream); 
+1

Muchas gracias por la ayuda con esto. –

Cuestiones relacionadas