2012-01-18 5 views
6

Tôi nhận được ngoại lệ sau khi tôi cố gắng unmarshall XML trở lại vào mã java. Có vẻ như tôi đang bỏ lỡ việc khai báo không gian tên ở đâu đó, nhưng tôi không chắc chắn ở đâu.UnmarshalException - Vấn đề không gian tên?

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

tập tin này ban đầu được tạo ra với một JAXB marshaller đây:

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

Dưới đây là top của file 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> 

Đây là phía trên cùng của tập tin XML để được unmarshalled:

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

Đây là phần đầu của tệp JAXB được tạo Java:

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

Tôi đã thử thêm phần tử không gian tên vào Chú thích nhưng nó không có sự khác biệt.

Dưới đây là nội dung gói-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; 

Và cuối cùng ở đây là mã 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); 
    } 

Cảm ơn-in-trước,

Guido

PS Tôi đang sử dụng Netbeans 7 để tạo ra các ràng buộc.

+0

Bạn có thể tìm thấy những hữu ích sau đây: http: // blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html –

+0

@BlaiseDoughan - Tôi đưa ra một số thông tin khác ở trên. Bạn có nghĩ rằng tôi cần phải thêm một "NamespacePrefixMapper?" –

+0

Bạn không cần sử dụng 'NamespacePrefixMapper'. Dường như tài liệu đầu vào của bạn không phải là không gian tên đủ điều kiện. Mã unmarshal của bạn trông như thế nào? –

Trả lời

4

Trong mẫu của bạn, bạn cần phải thiết lập DocumentBuilderFactory của bạn sẽ được namespace biết:

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

Bạn cũng có thể unmarshal các ByteArrayInputStream trực tiếp:

unmarshaller.unmarshal(xmlStream); 
+1

Cảm ơn bạn rất nhiều vì đã trợ giúp về điều này. –