2015-07-11 82 views
2

有什么方法可以在KML文件中删除额外的命名空间前缀(即ns2)?适用于KML的Java API(JAK) - 删除额外的ns2注释(kml)

这是我从我的代码收到KML的例子:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:kml xmlns="http://www.google.com/kml/ext/2.2"  xmlns:ns2="http://www.opengis.net/kml/2.2" xmlns:ns3="http://www.w3.org/2005/Atom" xmlns:ns4="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"> 
    <ns2:Placemark> 
     <ns2:name>London, UK</ns2:name> 
     <ns2:open>1</ns2:open> 
     <ns2:Point> 
      <ns2:coordinates>-0.126236,51.500152</ns2:coordinates> 
     </ns2:Point> 
    </ns2:Placemark> 
</ns2:kml> 

我想是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:gx="http://www.google.com/kml/ext/2.2"> 
    <Placemark> 
        <name>London, UK</name> 
        <open>true</open> 
        <Point> 
            <altitudeMode>clampToGround</altitudeMode> 
            <coordinates>-0.126236,51.500152</coordinates> 
        </Point> 
    </Placemark> 
</kml> 

这是我的Java代码:

final Kml kml = new Kml();  
kml.createAndSetPlacemark() 
.withName("London, UK").withOpen(Boolean.TRUE) 
.createAndSetPoint().addToCoordinates(-0.126236, 51.500152); 
//marshals to console 
kml.marshal(); 
//marshals into file 
kml.marshal(new File("output.kml")); 

任何帮助非常感谢!谢谢!

+0

的可能重复【JAVA:编组对象 - 在XML中,除去多余的NS2注释](http://stackoverflow.com/questions/7014746/ java-marshalling-object-removing-extra-ns2-annotation-in-xml) – geocodezip

+0

我没有从那里得到任何解决方案... –

回答

0

你可以试试这个代码

Marshaller m = JAXBContext.newInstance(new Class[] { Kml.class }).createMarshaller(); 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
m.setProperty(Marshaller.JAXB_FRAGMENT, false); 
m.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "UTF-8"); 
final Kml kml = new Kml();  
kml.createAndSetPlacemark() 
.withName("London, UK").withOpen(Boolean.TRUE) 
.createAndSetPoint().addToCoordinates(-0.126236, 51.500152); 
StringWriter sw = new StringWriter(); 
m.marshal(kml,sw); 
String s1 = sw.toString(); 
System.out.println(s1); 

它产生我

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<kml:kml xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <kml:Placemark> 
     <kml:name>London, UK</kml:name> 
     <kml:open>1</kml:open> 
     <kml:Point> 
      <kml:coordinates>-0.126236,51.500152</kml:coordinates> 
     </kml:Point> 
    </kml:Placemark> 
</kml:kml> 

如果没有,我会追捕我可能已经到了JAK代码所做的其他更改。

+0

不幸的是,这并没有解决Google Maps问题。它们的实现看起来根本不需要任何前缀,包括** kml:**似乎源包必须具有不同的注释:[在JAXB编组时,删除命名空间前缀](http://stackoverflow.com/a/22755785/194624 ) – Surge

+0

我不知道你可以将KML导入Google地图,或者不记得。无论如何,我非常确定,在某些时候,我设法通过使用XMLStreamWriter属性完全删除前缀https://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamWriter.html – ZiglioUK

1

这将完全避免KML元素的前缀:

Marshaller marshaller = JAXBContext.newInstance(new Class[]{Kml.class}).createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() 
{ 
    @Override 
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) 
    { 
     return namespaceUri.matches("http://www.w3.org/\\d{4}/Atom") ? "atom" 
       : (
       namespaceUri.matches("urn:oasis:names:tc:ciq:xsdschema:xAL:.*?") ? "xal" 
         : (
         namespaceUri.matches("http://www.google.com/kml/ext/.*?") ? "gx" 
           : (
           namespaceUri.matches("http://www.opengis.net/kml/.*?") ? "" 
             : (
             null 
             ) 
           ) 
         ) 
       ); 
    } 
}); 
marshaller.marshal(kml, file);