我有一个KML文件,它是世界各地的坐标列表和其他一些属性。对于一个地方看起来像这样:
<Placemark>
<name>Albania - Durrës</name>
<open>0</open>
<visibility>1</visibility>
<description>(Spot ID: 275801) show <![CDATA[<a href="http://www.windguru.cz/int/index.php?go=1&vs=1&sc=275801">forecast</a>]]></description>
<styleUrl>#wgStyle001</styleUrl><Point>
<coordinates>19.489747,41.277806,0</coordinates>
</Point>
<LookAt><range>200000</range><longitude>19.489747</longitude><latitude>41.277806</latitude></LookAt>
</Placemark>
我想删除除地点名称之外的所有内容。所以在这种情况下,这意味着我想删除除
之外的所有内容<name>Albania - Durrës</name>
问题是,这个KML文件包含1000多个这样的地方。显然手动执行此操作显然不是一个选项,那么如何删除列表中所有项目的名称标签以外的所有标签?我可以使用某种程序吗?
答案 0 :(得分:1)
使用专门的命令行工具来理解XML文档。
其中一个工具是xmlstarlet,可用于Linux,Windows和Solaris的here。
为了解决您的特定问题,我使用了xmlstarlet可执行文件xml.exe
(在Windows上):
xml.exe sel -N ns=http://www.opengis.net/kml/2.2 -t -v /ns:kml/ns:Document/ns:Placemark/ns:name places.kml
这会产生此输出:
Albania - Durrës
Second Name
Third Name
...
Final Name
如果您可以保证<name>
仅作为<Placemark>
的孩子出现,则此缩写版本将产生相同的结果:
xml.exe sel -N ns=http://www.opengis.net/kml/2.2 -t -v //ns:name places.kml
(这是因为这个较短的版本会找到所有 <name>
元素,无论它们出现在文档中的什么位置。)
如果您真的想要XML文档,则需要进行一些后期处理。以下是完整XML文档的示例:
<?xml version='1.0' encoding='utf-8'?>
<items>
<item>Albania - Durrës</item>
<item>Second Name</item>
<item>Third Name</item>
<!-- ... -->
<item>Final Name</item>
</items>
第一行是XML声明。它声明了Unicode编码utf-8
。您需要包含此行,以便XML处理器识别您的文档包含Unicode字符。 (如都拉斯。)
更多:这是一个增强的'xmlstarlet'命令,它将生成上面的XML文档:
xml.exe sel -N ns=http://www.opengis.net/kml/2.2 -T -t -o "<?xml version='1.0' encoding='utf-8'?>" -n -t -v "'<items>'" -n -t -m //ns:Placemark -v "concat('<item>',ns:name,'</item>')" -n -t -o "</items>" -n places.kml
答案 1 :(得分:0)
如果您使用的是Linux或类似产品:
grep "<name>" your_file.kml > file_with_only_name_tags
在Windows上,请参阅What are good grep tools for Windows?