• 締切済み

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"; } ---------------------------------------

みんなの回答

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

@nodes = $doc->findnodes ( "//*[local-name()='item']/*[local-name()='item']" ); を、 @nodes = $doc->findnodes ( "//*[local-name()='item']" ); とするだけです。 現状だと検索パスが”/item/item”で、<item>要素の中の入れ子になっている<item>要素がfindnodesで取り出されます。 そこで検索パスを”/item”にすれば親の<item>要素が取り出せます。

fuuuuuji
質問者

お礼

bgbgさん、ご回答頂きありがとうございました。