【问题标题】:How to parse KML files using perl?如何使用 perl 解析 KML 文件?
【发布时间】:2013-06-21 08:43:31
【问题描述】:

我正在尝试使用 perl 解析 KML 文件。我正在尝试使用XML::Simple 模块来执行此操作。

我想遍历每个地标并提取一些数据

1) Mcode
2) 坐标

看了几篇帖子,我尝试了以下只是为了打印所有点的坐标,但它失败了

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $myFile = XMLin('ExperimentMap.kml');

foreach my $folder (@{$myFile->{Document}->{Folder}->{Placemark}})  {
    print $folder->{Point}->{coordinates}."\n";
}

我正在使用以下 KML:

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'>
    <Document>
        <name>ExperimentMap</name>
        <description><![CDATA[]]></description>
        <Folder>
            <name>ExperimentLayer</name>
            <Placemark>
                <styleUrl>#icon-503-FF8277</styleUrl>
                <name>home</name>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>Mcode</displayName>
                        <value>PLAAB</value>
                    </Data>
                </ExtendedData>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>postal code</displayName>
                        <value>450010</value>
                    </Data>
                </ExtendedData>
                <description><![CDATA[my home


Mcode: PLAAB
postal code: 450010]]></description>
                <Point>
                    <coordinates>80.23435592651367,13.094024942328286,0.0</coordinates>
                </Point>
            </Placemark>
            <Placemark>
                <styleUrl>#icon-503-FF8277</styleUrl>
                <name>shop</name>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>Mcode</displayName>
                        <value>XMPLE</value>
                    </Data>
                </ExtendedData>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>postal code</displayName>
                        <value>450013</value>
                    </Data>
                </ExtendedData>
                <description><![CDATA[my shop


Mcode: XMPLE
postal code: 450013]]></description>
                <Point>
                    <coordinates>80.2437973022461,13.106230102044576,0.0</coordinates>
                </Point>
            </Placemark>
            <Placemark>
                <styleUrl>#icon-503-FF8277</styleUrl>
                <name>place3</name>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>Mcode</displayName>
                        <value>UDKBL</value>
                    </Data>
                </ExtendedData>
                <ExtendedData>
                    <Data name='string'>
                        <displayName>postal code</displayName>
                        <value>578635</value>
                    </Data>
                </ExtendedData>
                <description><![CDATA[my school


Mcode: UDKBL
postal code: 578635]]></description>
                <Point>
                    <coordinates>80.24688720703125,13.096198508196448,0.0</coordinates>
                </Point>
            </Placemark>
        </Folder>
        <Style id='icon-503-FF8277'>
            <IconStyle>
                <color>ff7782FF</color>
                <scale>1.1</scale>
                <Icon>
                    <href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
                </Icon>
            </IconStyle>
        </Style>
    </Document>
</kml>

【问题讨论】:

    标签: xml perl google-maps kml


    【解决方案1】:

    怎么样:

    while (my ($key, $folder) = each %{$myFile->{Document}{Folder}{Placemark}})  {
        print $folder->{Point}->{coordinates}."\n";
    }
    

    输出:

    80.2437973022461,13.106230102044576,0.0
    80.24688720703125,13.096198508196448,0.0
    80.23435592651367,13.094024942328286,0.0
    

    在您的代码中,您正在使用

    foreach my $folder (@{$myFile->{Document}->{Folder}->{Placemark}})  {
        print $folder->{Point}->{coordinates}."\n";
    }
    

    假设$myFile-&gt;{Document}-&gt;{Folder}-&gt;{Placemark} 是对数组的引用。但它不是,它是对哈希的引用,所以你必须遍历它并 foreach 对 (key,value) 从值中提取坐标。

    【讨论】:

      【解决方案2】:

      我认为我不会为此使用 XML::Simple。

      使用 XML::Twig,你会这样写:

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      use 5.10.0; # to get 'say'
      
      use XML::Twig;
      
      XML::Twig->new( twig_roots => { coordinates => sub { say $_->text; } })
               ->parsefile( $ARGV[0]);
      

      【讨论】:

        【解决方案3】:

        另一种可能性是使用XML::LibXML 和XPaths。 XPaths 的优点是这些也可用于其他语言,因此其他开发人员可能会理解您的代码。 XPaths 的缺点是在存在命名空间(这里就是这种情况)的情况下它们的使用不再好,导致一些看起来很难看的变通方法,比如使用 local-name() 函数。

        这是一个示例脚本:

        use XML::LibXML;
        my $doc = XML::LibXML->new->parse_file('ExperimentMap.kml');
        for my $coordinate_node ($doc->findnodes('//*[local-name()="coordinates"]')) {
            print $coordinate_node->textContent, "\n";
        }
        

        【讨论】:

          猜你喜欢
          • 2012-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-17
          相关资源
          最近更新 更多