使用正则表达式从 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 starletsed:

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 应该是开箱即用的。