1

我有一个 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 多个这样的地方。手动执行此操作显然不是一个选项,那么如何删除列表中所有项目的名称标签以外的所有标签?我可以为此使用某种程序吗?

4

2 回答 2

1

使用能够理解 XML 文档的专用命令行工具。

一个这样的工具是xmlstarlet,它在此处可用于 Linux、Windows 和 Solaris。

为了解决您的特定问题,我使用了这样的 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
于 2012-09-09T03:39:59.127 回答
0

如果您使用的是 linux 或类似设备:

grep "<name>" your_file.kml > file_with_only_name_tags

在 Windows 上,请参阅哪些是适用于 Windows 的好 grep 工具?

于 2012-09-04T23:46:32.833 回答