- 締切済み
perl XMLの入れ子取得方法
下記のようなツリー状のXMLから、親となっている情報と子の情報を分けて取得したいのですが、testプログラムで、子だけは取れましたが親の情報だけ取り出す方法が分かりません。どなたか取得方法、サンプルなどを教えていただけないでしょうか? --------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:review="http://www.test.com/"> <channel> <title>test</title> <language>ja</language> <item> <number>1</number> <title>親レビュータイトル</title> <item> <number>3</number> <title>子レビュー2タイトル</title> </item> <item> <number>2</number> <title>子レビュー1タイトル</title> </item> </item> </channel> </rss> --------------------------------------- #testプログラム #!/usr/local/bin/perl use XML::LibXML; #$rss は上記のXMLの内容 $parser = XML::LibXML->new; $doc = $parser->parse_string($rss); @nodes = $doc->findnodes ( "//*[local-name()='item']/*[local-name()='item']" ); for $node (@nodes){ $item ->{'number'} = Henkan::henkan( "-Wexm0",$node->findvalue("./number/text()")); $item ->{'title'} = Henkan::henkan( "-Wexm0",$node->findvalue("./title/text()")); print "[$item ->{'number'}]\n"; print "[$item ->{'title'}]\n"; } ---------------------------------------
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- bgbg
- ベストアンサー率53% (94/175)
@nodes = $doc->findnodes ( "//*[local-name()='item']/*[local-name()='item']" ); を、 @nodes = $doc->findnodes ( "//*[local-name()='item']" ); とするだけです。 現状だと検索パスが”/item/item”で、<item>要素の中の入れ子になっている<item>要素がfindnodesで取り出されます。 そこで検索パスを”/item”にすれば親の<item>要素が取り出せます。
お礼
bgbgさん、ご回答頂きありがとうございました。