使用正则表达式从 KML (XML) 文件导出 Google 地图地址
Using Regex to Export Google Map Addresses from a KML (XML) file
我在 KML 文件中有一个巨大的地址列表,我真的很困惑如何提取除 <address></address>
标签内的内容之外的所有内容。
这是 XML 的示例:
<Placemark>
<styleUrl>#icon-ci-1</styleUrl>
<name>PIGGLY WIGGLY COOGLE #276 B/C </name>
<ExtendedData>
<Data name='Address'>
<value>309 E OAK ST MCRAE GA31055 </value>
</Data>
</ExtendedData>
<description><![CDATA[Address: 309 E OAK ST MCRAE GA31055 ]]></description>
<address>309 E OAK ST MCRAE GA31055 </address>
</Placemark>
<Placemark>
<styleUrl>#icon-ci-1</styleUrl>
<name>THE CORNER STORE INC </name>
<ExtendedData>
<Data name='Address'>
<value>1998 DAYTON BLVD CHATTANOOGA TN37415 </value>
</Data>
</ExtendedData>
<description><![CDATA[Address: 1998 DAYTON BLVD CHATTANOOGA TN37415 ]]></description>
<address>1998 DAYTON BLVD CHATTANOOGA TN37415 </address>
</Placemark>
<Placemark>
<styleUrl>#icon-ci-1</styleUrl>
<name>KAMBOI #2 </name>
<ExtendedData>
<Data name='Address'>
<value>4901 BONNY OAKS DR CHATTANOOGA TN37416 </value>
</Data>
</ExtendedData>
<description><![CDATA[Address: 4901 BONNY OAKS DR CHATTANOOGA TN37416 ]]></description>
<address>4901 BONNY OAKS DR CHATTANOOGA TN37416 </address>
</Placemark>
有人知道如何使用 Regex 以这种方式提取此数据吗?
309 E OAK ST MCRAE GA31055
1998 DAYTON BLVD CHATTANOOGA TN37415
4901 BONNY OAKS DR CHATTANOOGA TN37416
提前致谢!
Regexen 不是您工作的首选工具。虽然你 可能 与强大的正则表达式引擎(例如 perl 或 php 中的引擎)相处得很好,但你很可能会在边缘情况下失败,并且保证解决方案是维护的噩梦。
最好使用命令行工具 xml starlet
和 sed
:
xml sel -t -c "/root/Placemark/address" in.xml >temp.xml
sed 's%</address>%\n%g;s%<address>%%g' temp.xml > out.xml
解释:
- 第一个命令从 xml 中精确提取
address
元素并将它们写入临时文件
- 第二个命令删除
address
元素插入换行符来分隔数据行
备选方案:
基本上,xml starlet 是一组通过 xslt 处理 xml 文件的便捷简写(此评论根本不是要贬低其作者的工作!)。因此,第一步可以使用以下 xslt 替换为 运行 输入文件上的 xslt 处理器:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:copy-of select="/root/Placemark/address"/>
</xsl:template>
</xsl:stylesheet>
有许多可用的 xslt 处理器(参见 this SO question。在大多数 Linux 上,xsltproc
应该是开箱即用的。
我在 KML 文件中有一个巨大的地址列表,我真的很困惑如何提取除 <address></address>
标签内的内容之外的所有内容。
这是 XML 的示例:
<Placemark>
<styleUrl>#icon-ci-1</styleUrl>
<name>PIGGLY WIGGLY COOGLE #276 B/C </name>
<ExtendedData>
<Data name='Address'>
<value>309 E OAK ST MCRAE GA31055 </value>
</Data>
</ExtendedData>
<description><![CDATA[Address: 309 E OAK ST MCRAE GA31055 ]]></description>
<address>309 E OAK ST MCRAE GA31055 </address>
</Placemark>
<Placemark>
<styleUrl>#icon-ci-1</styleUrl>
<name>THE CORNER STORE INC </name>
<ExtendedData>
<Data name='Address'>
<value>1998 DAYTON BLVD CHATTANOOGA TN37415 </value>
</Data>
</ExtendedData>
<description><![CDATA[Address: 1998 DAYTON BLVD CHATTANOOGA TN37415 ]]></description>
<address>1998 DAYTON BLVD CHATTANOOGA TN37415 </address>
</Placemark>
<Placemark>
<styleUrl>#icon-ci-1</styleUrl>
<name>KAMBOI #2 </name>
<ExtendedData>
<Data name='Address'>
<value>4901 BONNY OAKS DR CHATTANOOGA TN37416 </value>
</Data>
</ExtendedData>
<description><![CDATA[Address: 4901 BONNY OAKS DR CHATTANOOGA TN37416 ]]></description>
<address>4901 BONNY OAKS DR CHATTANOOGA TN37416 </address>
</Placemark>
有人知道如何使用 Regex 以这种方式提取此数据吗?
309 E OAK ST MCRAE GA31055
1998 DAYTON BLVD CHATTANOOGA TN37415
4901 BONNY OAKS DR CHATTANOOGA TN37416
提前致谢!
Regexen 不是您工作的首选工具。虽然你 可能 与强大的正则表达式引擎(例如 perl 或 php 中的引擎)相处得很好,但你很可能会在边缘情况下失败,并且保证解决方案是维护的噩梦。
最好使用命令行工具 xml starlet
和 sed
:
xml sel -t -c "/root/Placemark/address" in.xml >temp.xml
sed 's%</address>%\n%g;s%<address>%%g' temp.xml > out.xml
解释:
- 第一个命令从 xml 中精确提取
address
元素并将它们写入临时文件 - 第二个命令删除
address
元素插入换行符来分隔数据行
备选方案:
基本上,xml starlet 是一组通过 xslt 处理 xml 文件的便捷简写(此评论根本不是要贬低其作者的工作!)。因此,第一步可以使用以下 xslt 替换为 运行 输入文件上的 xslt 处理器:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:copy-of select="/root/Placemark/address"/>
</xsl:template>
</xsl:stylesheet>
有许多可用的 xslt 处理器(参见 this SO question。在大多数 Linux 上,xsltproc
应该是开箱即用的。