2014-05-08 122 views
4

出於某種原因,我必須手動解析KML文件,它看起來像這樣:命名空間:javax.xml.bind.UnmarshalException:意外的元素

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> 
    <Document> 
     ... 
     <Placemark> 
      <Point><coordinates>13.38705,52.52715,0</coordinates></Point> 
      <Name>My name</Name> 
      <description xmlns="">Hallo World</description> 
     </Placemark> 
    </Document> 
</kml> 

對於它映射到Java我寫了下面的類

@XmlRootElement(name = "kml", namespace = "http://www.opengis.net/kml/2.2") 
public class Kml { 
// <kml xmlns="http://www.opengis.net/kml/2.2"> 
    Document document; 

    @XmlElement(name = "Document") 
    public Document getDocument() { 
     return document; 
    } 

    public void setDocument(Document document) { 
     this.document = document; 
    } 
} 

使用Jaxb我得到了下面的解析器。

public class JAXBKmlParser { 

private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

public Kml klmParser(final String kmlFile) { 

    Kml kml = null; 
    try { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Kml.class); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     StringReader reader = new StringReader(kmlFile); 
     kml = (Kml) unmarshaller.unmarshal(reader); 

    } catch (JAXBException e) { 
     logger.error("JABX Exception corrupted KML", e); 
    } 

    return kml; 
    } 
} 

我的問題是xml namespace屬性無法識別。

如果我改變註釋

@XmlRootElement(name = "kml", namespace = "http://www.opengis.net/kml/2.2") 

@XmlRootElement(name = "kml") 

,並從我的KML的頭部去除空間文件,然後解析工作沒有任何問題。

我的問題是如何解決這個問題而不刪除命名空間。

請注意,description標籤也有一個名稱空間。

+0

注意:我已經閱讀了所有關於這個或類似問題的主題,並沒有任何建議起作用。 – Luixv

回答

7

由於XML文檔利用默認名稱空間,因此應使用程序包級別@XmlSchema註釋來映射名稱空間限定。 @XmlSchema註釋被添加到名爲package-info的特殊類中,該類與域模型位於同一個包中,幷包含以下內容。指定@XmlSchema時,您不需要指定任何其他名稱空間信息。

package-info.java

@XmlSchema(
    namespace = "http://www.opengis.net/kml/2.2", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

更多信息

你可以閱讀更多有關JAXB和命名空間在我的博客:

+0

謝謝,我注意到標籤也有一個空的名字空間。解析這個標籤會返回一個「null」對象。我該如何解決這個(第二個)問題? – Luixv

+0

好的。我已經添加了@XmlElement(name="description", namespace = "")註釋,它正在工作。再次感謝! – Luixv

相關問題