我试图获得"经度"的价值。来自以下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>
答案 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";
}
这只是一个简单的例子,您可以根据自己的需要进行更改