当前位置: 首页 > 知识库问答 >
问题:

Java API for KML (JAK) - 删除 kml 中多余的 ns2 注释

艾跃
2023-03-14

有没有办法删除KML文件中额外的命名空间前缀(即ns2)?

这是我从代码中收到的 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"));

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

共有2个答案

奚晟
2023-03-14

你能试试这个代码吗

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代码所做的其他更改。

傅涵忍
2023-03-14

这将完全避免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);
 类似资料:
  • 问题内容: 我试图将对象内的数据编组为基于已定义架构的xml文件。但是,当我打印出xml文件时,我会在xml标签上收到额外的注释。有什么办法摆脱多余的命名空间注释(即ns2) 这是我从编组中收到的xml的示例。 我想要的是这样的: 这是我的Java代码正在做的事情: 任何帮助深表感谢!谢谢! 问题答案: 通过向用于构造JAXB元素的名称空间添加URI名称空间URI(“ http://www.som

  • 问题内容: 我从数据库查询中接收到一个字符串,然后在将其放入CSV文件之前,删除了所有HTML标记,回车符和换行符。唯一的事情是,我找不到从字符串 之间 删除 多余的 空白的方法。 __ 删除内部空白字符的最佳方法是什么? 问题答案: 不确定确切要什么,但是有两种情况: 如果你只是处理过剩上,你可以使用字符串的开头或结尾,或者将其删除。 如果你正在处理一个字符串中多余的空格考虑多 用单 。 例:

  • 本文向大家介绍Ubuntu删除多余内核的方法,包括了Ubuntu删除多余内核的方法的使用技巧和注意事项,需要的朋友参考一下 第一步:查看当前内核 当前使用版本为: 4.15.0-42-generic 第二步:查看所有内核 第三步:移除冗余内核 所有 39 版本的对我来说都是多余的,进行删除: 卸载后重新检查: 状态为 deinstall 即已经卸载,如果觉得看着不舒服的话可以使用 purge 连配

  • 问题内容: 我正在通过批处理文件运行文件 批处理文件: SQL文件abc.sql: Output.txt: 请帮助我删除output.txt文件开头和结尾的多余数据。 问题答案: 似乎是您要找的东西; [-沉默的]](https://docs.oracle.com/cd/B10501_01/server.920/a90842/ch4.htm#1006196) 禁止所有SQL * Plus信息和提示

  • 我目前正在使用JAK(KML的Java API)与Google Earth和定制的KML文件进行交互。我可以使用placemark p.getName()或point等工具获取/设置地名的名称、描述和坐标。getCoordinates();但我遇到的问题是获取图标所用图像的url。例如,如果我的kml文件中有这个placemark(包含在文档中,然后是整个kml标记): 我怎样才能抓住那个png

  • 问题内容: 有没有一种方法可以使用Java API for KML(JAK)将图像文件添加到kmz文件中?我可以毫无问题地创建一个kml文件,但是我试图嵌入资源(例如带有一些图像文件的images文件夹),但是marshalAsKmz方法仅将Kml对象作为附加文件,因此我无法确定了解如何仅添加额外的图像。 问题答案: 我在一个项目上使用JAK已有一年多了。我用它来创建KML,然后将其编组为普通的K