XML:简单和多层次

时间:2016-03-23 15:58:27

标签: xml perl

我试图获得"经度"的价值。来自以下XML :: Simple。

有人可以提供代码示例吗?

<response>
<feedMessageResponse>
<count>1</count>
<feed>...
<id>02JvgufQqMhyMgAB5Rv7DOgge0LJjSly0</id>
</feed>
<totalCount>1</totalCount>
<activityCount>0</activityCount>
<messages>
<message clientUnixTime="0">
<id>527604536</id>
<messengerId>0-2136339</messengerId>
<messengerName>michael</messengerName>
<unixTime>1458736183</unixTime>
<messageType>TRACK</messageType>
<latitude>35.3825</latitude>
<longitude>-80.92035</longitude>
<modelId>SPOTCONNECT</modelId>
<showCustomMsg>N</showCustomMsg>
<dateTime>2016-03-23T12:29:43+0000</dateTime>
<messageDetail/>
<batteryState>GOOD</batteryState>
<hidden>0</hidden>
</message>
</messages>
</feedMessageResponse>
</response>

3 个答案:

答案 0 :(得分:5)

我建议不要使用XML::Simple。它的谎言。这并不简单。 见这里:Why is XML::Simple "Discouraged"?

相反:

#!/usr/bin/perl
use strict;
use warnings;

use XML::Twig;

print XML::Twig -> parse ( \*DATA) -> get_xpath('//longitude',0) -> text;

__DATA__
<response>
<feedMessageResponse>
<count>1</count>
<feed>...</feed>
<totalCount>1</totalCount>
<activityCount>0</activityCount>
<messages>
<message clientUnixTime="0">
<id>527604536</id>
<messengerId>0-2136339</messengerId>
<messengerName>michael</messengerName>
<unixTime>1458736183</unixTime>
<messageType>TRACK</messageType>
<latitude>35.3825</latitude>
<longitude>-80.92035</longitude>
<modelId>SPOTCONNECT</modelId>
<showCustomMsg>N</showCustomMsg>
<dateTime>2016-03-23T12:29:43+0000</dateTime>
<messageDetail/>
<batteryState>GOOD</batteryState>
<hidden>0</hidden>
</message>
</messages>
</feedMessageResponse>
</response>

输出:

-80.92035

答案 1 :(得分:1)

来自XML::Simple的文档:

  

不鼓励在新代码中使用此模块。其他模块是   可用,提供更直接和一致   接口。特别是,强烈推荐使用XML :: LibXML   XML :: Twig是一个很好的选择。

     

此模块的主要问题是大量选项   (其中一些有不幸的默认值)和任意方式   这些选项相互作用 - 通常会产生意想不到的结果。

但是如果你想忽略那个警告,你可以像这样使用XML :: Simple:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use XML::Simple;

my $doc = XMLin('data.xml');

say $doc->{feedMessageResponse}{messages}{message}{longitude};

就个人而言,我更喜欢XML :: LibXML。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use XML::LibXML;

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('data.xml');

say $doc->findvalue('//longitude');

答案 2 :(得分:1)

我同意Dave Cross,我发现XML :: LibXML要容易得多。如果您的文件包含多个经度值

,我会这样做
#!/usr/bin/perl

use warnings;
use strict;
use XML::LibXML;

my $file = 'test.xml'; #location of the file or it could be a url as well

my $parser = XML::LibXML->new();
my $tree = $parser->parse_file($file);
my $root = $tree->getDocumentElement;
my @longitude = $root->getElementsByTagName('longitude');

foreach my $res (@longitude) {
    print "Longitude : " . $res->textContent() . "\n";
}

这只是一个简单的例子,您可以根据自己的需要进行更改