有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java名称空间:javax。xml。绑定解组异常:意外元素

出于某些原因,我必须手动解析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;
    }
}

我的问题是无法识别xmlnamespace属性

如果我更改注释

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

 @XmlRootElement(name = "kml")

并从我的KML文件的头中删除名称空间,那么解析工作就不会有任何问题

我的问题是如何在不删除名称空间的情况下处理这个问题

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


共 (1) 个答案

  1. # 1 楼答案

    由于XML文档利用了默认名称空间,因此应该使用包级别的@XmlSchema注释来映射名称空间限定。@XmlSchema注释被添加到名为package-info的特殊类中,该类与域模型位于同一个包中,并包含以下内容。指定了@XmlSchema之后,就不需要指定任何其他名称空间信息

    包信息。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和名称空间的信息: