2012-03-11 3 views
10

Perlを使用してXMLファイルを解析したいと思います。 XML :: Simpleモジュールを使用してこれを行うことができましたが、XPathという表現を使用するため、XML :: XPathモジュールを代わりに使用したいと考えています。私の限られた知識から、XPathsは将来の解析を容易にすると思います。 は、ここで私がこれまで持っているPerlコードです:Perl、XMLファイルを解析する方法、xpath

use strict; 
use warnings; 
use XML::XPath; 

my $file = "data.xml"; 
my $path = XML::XPath->new(filename => $file); 

my $name = $path->find('/category/event/@name'); 
print $name."\n"; 

私の質問は、私は私が解析各値のテストを行うことができるように、私は(カテゴリ/イベント/ @)各name属性を分離しない方法です。現時点では、私はパースされたデータでいっぱいの大きな文字列を取得していますが、テストできるいくつかの小さな文字列が必要です。これどうやってするの?

答えて

18

This reviewポイント:-)おかげでそのXML::XPathは2003年以来更新され、XML::LibXML代わり

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

my $dom = XML::LibXML->new->parse_file('data.xml'); 
for my $node ($dom->findnodes('/category/event/@name')) { 
    say $node->toString; 
} 

を推奨されていないからではXML::LibXML::ParserXML::LibXML::Nodeを参照してください。

+3

あなたは' XML :: LibXML'を推奨している始める、または必要があります。 :XPath'?私の知る限り、後者はうまく動作します。それは純粋なPerlであり、LibXMLよりも遅くなりますが、外部ライブラリの助けを借りなくても使用できます。 – Borodin

+3

これはハイパーリンクです。それに従ってください。 – daxim

+0

@daxim返事をありがとう。私はそれが働いたことを試みたが、私が望む方法では100%ではなかった。私の出力はname = "attribute_value"ですが、attribute_valueだけが必要です。 name = ""なしでattribute_valueを出力する方法はありますか? – liverpaul

7

findメソッドは、すべてのノードのコレクションであるXML::XPath::NodeSetオブジェクトを返します。すべての属性値を持つ1つの長い文字列を見るためにできることを想像することはできません。

ノードのセットを取得したら、sizeget_nodeget_nodelistのようなメソッドを使用して作業します(上記のドキュメントを参照してください)。 get_nodelistは、この場合はXML::XPath::Node::AttributeのPerlリストを返します。これらのオブジェクトも独自のメソッドを持っています。あなたはそれがXML `オーバー本物の利点を持っていると思うので、このプログラムは、あなたがそれをよりよく知っているので、

use strict; 
use warnings; 

use XML::XPath; 

my $xp = XML::XPath->new(ioref => \*DATA); 

my $names = $xp->find('/category/event/@name'); 

for my $node ($names->get_nodelist) { 
    say $node->getNodeValue; 
} 


__DATA__ 
    <category name="a"> 
    <event name="cat1" /> 
    <event name="cat2" /> 
    <event name="cat3" /> 
    <event name="cat4" /> 
    <event name="cat5" /> 
    </category> 

OUTPUT

cat1 
cat2 
cat3 
cat4 
cat5 
+0

返事をありがとう。 daximが投稿したリンクを読んだ後、代わりにXML :: LibXMLを使うことにしました。それは最善の策だと思われるので、初心者としては、モジュールが良く分かりました。あなたが書いた紹介情報をいただきありがとうございます。それは少し良く理解してくれました.-) – liverpaul

+0

'XML :: XPath'を使って、パス内に'^'や' * 'を使用できますか? EX: 'my $ names = $ xp-> find( '/ category/eve *');' .Inside 'category'では、' eve'で始まるタグを検索します。 – Venkatesh

関連する問題