2012-01-18 3 views
6

Я получаю следующее исключение, когда пытаюсь отменить XML-код обратно в java-код. Кажется, я где-то пропускаю декларацию пространства имен, но я не уверен, где.UnmarshalException - Пространство имен?

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

Этот файл изначально был создан с JAXB ИАС здесь:

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

Вот верхняя часть файла схемы:

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

Вот верх файла XML не должно быть размещено:

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

Вот вершина JAXB генерируется Java файл:

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

Я попытался добавить элемент пространства имен в аннотации, но это не имело никакого значения.

Вот содержимое пакета-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; 

И, наконец, вот демаршаллинга код:

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

Благодаря-в-заранее,

Guido

PS Я использую Netbeans 7 для создания привязок.

+0

Вы можете найти следующую полезную: HTTP: // blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html –

+0

@BlaiseDoughan - я поднял дополнительную информацию выше. Вы думаете, что мне нужно добавить «NamespacePrefixMapper»? –

+0

Вам не нужно использовать 'NamespacePrefixMapper'. Кажется, что ваш входной документ не является пространством имен. Как выглядит ваш немаршальный код? –

ответ

4

В вашем образце необходимо установить DocumentBuilderFactory быть пространством имен известно:

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

Вы также можете распаковать в ByteArrayInputStream непосредственно:

unmarshaller.unmarshal(xmlStream); 
+1

Большое спасибо за помощь в этом. –

Смежные вопросы