从XML文件中删除引用的重复条目

时间:2013-05-24 00:50:14

标签: xml

几个小时后,我的头靠在墙上,我觉得这可能不仅仅是一个shell脚本的工作。

Google地球上存在一个错误,导致加载KML文件非常慢:对于您创建的几乎所有新地标,它会创建2个新样式,在<styleUrl>中引用StyleMap上的样式,然后引用StyleMap地标:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
    <StyleMap id="m_ylw-pushpin">
        <Pair>
            <key>normal</key>
            <styleUrl>#s_ylw-pushpin</styleUrl>
        </Pair>
        <Pair>
            <key>highlight</key>
            <styleUrl>#s_ylw-pushpin_hl</styleUrl>
        </Pair>
    </StyleMap>
    <Style id="s_ylw-pushpin">
        <IconStyle>
            <scale>1.1</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
    </Style>
    <Style id="s_ylw-pushpin_hl">
        <IconStyle>
            <scale>1.3</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
    </Style>

    <StyleMap id="msn_ylw-pushpin">
        <Pair>
            <key>normal</key>
            <styleUrl>#sn_ylw-pushpin</styleUrl>
        </Pair>
        <Pair>
            <key>highlight</key>
            <styleUrl>#sh_ylw-pushpin</styleUrl>
        </Pair>
    </StyleMap>
    <Style id="sn_ylw-pushpin">
        <IconStyle>
            <scale>1.1</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
    </Style>
    <Style id="sh_ylw-pushpin">
        <IconStyle>
            <scale>1.3</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
    </Style>

    <Placemark>
        <LookAt>
            <altitude>0</altitude>
            <tilt>0</tilt>
            <gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
        </LookAt>
        <styleUrl>#m_ylw-pushpin</styleUrl>
        <Point>
            <gx:drawOrder>1</gx:drawOrder>
        </Point>
    </Placemark>
    <Placemark>
        <LookAt>
            <altitude>1</altitude>
            <tilt>0</tilt>
            <gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
        </LookAt>
        <styleUrl>#msn_ylw-pushpin</styleUrl>
        <Point>
            <gx:drawOrder>0</gx:drawOrder>
        </Point>
    </Placemark>
</Document>
</kml>
  • sh_ylw-pushpin s_ylw-pushpin_hl 是具有不同名称(id)的重复条目。每个都在不同的StyleMap上引用。这同样适用于 sn_ylw-pushpin s_ylw-pushpin
  • 如果我们删除重复的样式并修复它们的引用(例如s/\<sh_ylw-pushpin\>/s_ylw-pushpin_hl/),我们也会留下重复的StyleMaps,所以我们也应该重复它们的重复数据删除。

总结一下,我需要的是从XML文件中删除重复的条目(只留下一个),并将删除的条目的所有引用更新为剩下的条目。

1 个答案:

答案 0 :(得分:1)

由于您似乎知道自己想要做什么,因此建议您尝试使用命令行工具xmlstartlet执行此操作。看起来您可以通过编程方式从KML / XML文件中删除条目。

参考

注意: IBM教程将该工具引用为xml,只需将其与xmlstarlet交换。