出于某种原因,我必须手动解析看起来像这样的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标记还有一个名称空间。
答案 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和命名空间的更多信息: