【问题标题】:Namespace: javax.xml.bind.UnmarshalException: unexpected element命名空间:javax.xml.bind.UnmarshalException:意外元素
【发布时间】:2014-05-08 15:46:35
【问题描述】:

出于某种原因,我必须手动解析一个如下所示的 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 文件的标题中删除命名空间,然后解析工作没有任何问题。

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

注意描述标签也有一个命名空间。

【问题讨论】:

  • 注意:我已经阅读了 SO 关于这个或类似问题的所有主题,但没有任何建议奏效。

标签: java xml exception jaxb kml


【解决方案1】:

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

【讨论】:

  • 谢谢,我注意到 <description> 标签还有一个空的命名空间。解析这个标签会返回一个“null”对象。我该如何解决这个(第二个)问题?</description>
  • 好的。我添加了 @XmlElement(name="description", namespace = "" ) 注释并且它正在工作。再次感谢!
猜你喜欢
  • 2014-06-08
  • 2012-08-30
  • 2014-01-02
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多