命名空间:javax.xml.bind.UnmarshalException:意外元素

时间:2014-05-08 15:46:36

标签: java xml exception jaxb kml

出于某种原因,我必须手动解析看起来像这样的KML文件:

<?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标记还有一个名称空间。

1 个答案:

答案 0 :(得分:8)

由于您的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和命名空间的更多信息: