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

Lui*_*ixv 4 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>
Run Code Online (Sandbox Code Playgroud)

为了将它映射到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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是namespace无法识别xml 属性.

如果我更改注释

 @XmlRootElement(name = "kml", namespace = "http://www.opengis.net/kml/2.2")
Run Code Online (Sandbox Code Playgroud)

 @XmlRootElement(name = "kml")
Run Code Online (Sandbox Code Playgroud)

并从我的KML文件的标题中删除命名空间然后解析工作没有任何问题.

我的问题是如何在不删除命名空间的情况下解决这个问题.

请注意,description标记还有一个名称空间.

bdo*_*han 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;
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息

您可以在我的博客上阅读有关JAXB和命名空间的更多信息: