2016-03-23 8 views
-1

私はXML :: Simpleを使用して、以下から "経度"の値を取得しようとしています。XML:シンプルかつマルチレベル

誰かがコード例を提供できますか?

<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> 
+1

ニーズに合わせてそれを変更することができます。これは単なる一例である複数の経度値

#!/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"; } 

が含まれている場合、どうなるのかです:: LibXMLをより良い選択 - 単純なプロジェクトの場合でも。事実、私は具体的に[Perl XML :: LibXML by Example](http://grantm.github.io/perl-libxml-by-example/)を書いて人々の移動を手助けしています。 –

答えて

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> 

出力:XML::Simpleのドキュメントから

-80.92035 
+0

xmlファイルを入力用に開き、longitudeを変数として割り当てるにはどうすればよいですか? –

+0

XML :: Twigでドキュメントを読むと、 'parsefile'メソッドがあることがわかります。あるいは、上記のXML :: LibXMLの例で、 ' – Sobrique

1

新しいコードでは、このモジュールの使用は推奨されません。他のモジュールは、より直接的で一貫した インターフェイスを提供する が利用可能です。特に、XML :: LibXMLが強く推奨されており、 XML :: Twigは優れた選択肢です。

このモジュールの主な問題は、多くのオプション (一部には不都合なデフォルトがあります)とこれらのオプションが相互作用する任意の方法(予期しない結果を生じることがあります)です。

しかし、あなたはその警告を無視したい場合は、このような単純なXML ::を使用することができます。

#!/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'); 
+0

を解析(<>)するだけで済みます。 "id"の2番目のインスタンスをどのように指定しますか? –

+0

'findvalue()'のパラメータは[XPath](https://www.w3.org/TR/xpath/)の式です。私は 'position()'関数が必要だと思います。 –

1

私はDave Crossに同意します。私はXML :: LibXMLの方がはるかに簡単だと思います。これは私があなたのファイルは、あなたがXMLの著者::私は心からXMLを推奨するものでは単純に

関連する問題