• 締切済み

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

  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

  • 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さん、ご回答頂きありがとうございました。

関連するQ&A

  • perl言語 XMLの入れ子の取得方法

    下記のようなツリー状のXMLから、親となっている情報と、親の入れ子となっている子の情報を分けて取得したいのですが、どのようにすれば取得できるのでしょうか? --------------------------------------- <?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> --------------------------------------- XML解析あたりから悩んでいるので、サンプルなどあれば、教えていただければと思います。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl での XML 置換について

    perl で XML::LibXML モジュールを使用して下記のようなXMLのテキスト部分の置換をしようとしています。 <item id="1"> <name>hoge</name> <description> テスト<b>テスト</b>テスト </description> </item> <item id="2"> <name>hoge2</name> <description> テスト2<i>テスト2</i>テスト2 </description> </item> これに対して、 for $node ($dom->findnodes('//item/description/text()')){ $text = $node->toString; $text =~ s/.../.../; $node->setData($text); } のように置換する処理を考えたのですが、description の中に <b> や <i> のようなインライン要素があると正しく置換、書き戻しがされません(置換対象は、これらインライン要素の中にも外にもあります)。 これをなんとか正常に動作させる方法はあるでしょうか。 どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • XMLのエラー

    XMLのエラー RSS作りの勉強のため、XMLを作成していったんローカルフォルダに保存したあと、IE8でテスト表示してみたるとこんなエラーが出ます。↓↓ XML ページを表示できません XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。 -------------------------------------------------------------------------------- テキストの内容に無効な文字が見つかりました。リソース 'file:///(ファイルの保存場所)' の実行エラーです。 XMLの文は下です。 <?xml version="1.0" encoding="utf-8" ?> <rss version="2.0"> <channel>   <title>RSS2.0 Test</title>   <link>(適当なリンク先)</link>   <description>RSS2.0のテスト</description>   <language>ja</language>   <item>    <title>ページ1</title>    <link>(適当なリンク先)</link>    <description>1つ目のページ</description>    <pubDate>Mon, 20 Jul 2010 00:00:00 +0900</pubDate>   </item>   <item>    <title>ページ2</title>    <link>(適当なリンク先)</link>    <description>2つ目のページ</description>    <pubDate>Tue, 21 Jul 2010 03:04:05 +0900</pubDate>   </item> </channel> </rss> よろしくお願いします。

    • ベストアンサー
    • XML
  • PHPでRSSから要素を取得する方法について

    PHPでRSSから要素を取得する方法について 下記のrss情報から「lddata:syousai」にあるA,B,Cの各""内の情報をphpで変数に 格納しようと思っていますがどうしてもうまく行きません。 このような形式の場合、どのようにして取得したら良いのか お知恵を貸していただけないでしょうか。 PHPを勉強し始めたばかりなので恥ずかしい質問内容になっているかも知れませんが 何卒よろしくお願いいたします。 ▼XML 詳細 ・rssの場所 http://test.com/forecast/rss/test.xml ・rssの内容 <?xml version="1.0" encoding="UTF-8" ?> - <rss version="2.0" xmlns:lddata="http://test.com/ns/rss/2.0"> - <channel> <title>test</title> <link>http://test.com</link> - <item> <title>情報タイトル</title> <link>http://test.com/jyoho/2010-05-15-18-24.html?r=?rss</link> <lddata:syousai A="東京都" B="9" C="日付データ" />   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ↑変数に格納したい場所 </item> </channel> </rss>

    • ベストアンサー
    • PHP
  • PHPでxmlファイルへのデータの上書き方法

    混乱してしまっています。初心者です。 前回もPHPでの上書き方法をご教授いただいたのにごめんなさい。 PHPを使って、RSSを更新していくフォームを作成しております。 「入力した内容をPOSTでうけとって、xmlファイルにwで書き込む」 としましたら、最新の項目はでますが、履歴がきえます。もちろんです。 RSSでタグを書いていくとき更新情報は<item></item>にはいりますが、 その上にも下にもスクリプトがありますよね。<item></item>だけかきこんでいくというというのは どういった命令をしていけばいいのですか? お昼からずっと考えて、かなりまいっています。 お答えくださる方々にはとるにたらないような初歩的は質問かと存じますが、どうかご教授ください。 よろしくお願いします。 ↓「きえるRSSのなりそこない」 <!doctype html> <html> <head> <meta charset="jis" > <title>RSS登録</title> <body> <?php $title=$_POST["title"]; $text=$_POST["text"]; $url=$_POST["url"]; $rss=' <?xml version="1.0"?> <rss version="2.0"> <channel> <title>●●●</title> <link>●●.com</link> <description>最新の●●です</description> <lastBuildDate>Tue, 30 Jul 2013 22:32:44+0900</lastBuildDate> <item><title>'.$title.'</title><link>'.$url.'</link><description>'.$text.'</description></item> </channel> </rss> '; $f=fopen("rss.xml","w"); fputs($f,$rss); fclose($f); ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP4でXML

    こんにちは。PHPでXMLファイルを書き換えたいのですが、サーバ環境がPHP5ではありません。以下のようにHTMLと同じ方法でphpファイルを読み込むことは不可能なのでしょうか?だとしたら他に良い方法はありますか?困っています。どなたか助けてください。よろしくお願いします。 <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>○○1</title> <link>http://○○</link> <description>ウェブサイトに掲載されている最新の情報を掲載しております。</description> <language>ja</language> <copyright>Copyright (c) 2007 ○○, Inc. All Rights Reserved.</copyright> <pubDate><?php include("../rss/date.php"); ?></pubDate> <item> <title>ニュースリリース</title> <link>http://○○</link> <description><?php include("../rss/news.php"); ?></description> <pubDate><?php include("../rss/date.php"); ?></pubDate> </item> <item> <title>商品一覧ページ</title> <link>http://○○</link> <description><?php include("../rss/prodact.php"); ?></description> <pubDate><?php include("../rss/date.php"); ?></pubDate> </item> <item> <title>沿革</title> <link>http://○○</link> <description><?php include("../rss/corporation.php"); ?></description> <pubDate><?php include("../rss/date.php"); ?></pubDate> </item> </channel> </rss>

    • 締切済み
    • XML
  • XMLのソート

    XMLのソート http://okwave.jp/qa/q6069815.html に間違いがあったので訂正して再質問します。 このようなXMLがあります <?xml version="1.0" encoding="UTF-8" ?> <ROOT>  <CONTENTS>   (略)  </CONTENTS>  <ITEMS>   <ITEM>    <TITLE>ABC</TITLE>    <NUMBER>10</NUMBER>   </ITEM>   <ITEM>    <TITLE>DEF</TITLE>    <NUMBER>0</NUMBER>   </ITEM>   <ITEM>    <TITLE>GHI</TITLE>    <NUMBER>100</NUMBER>   </ITEM>   <ITEM>    <TITLE>JKL</TITLE>    <NUMBER>50</NUMBER>   </ITEM>  </ITEMS> </ROOT> これを、/ITEMS/ITEM/NUMBER でソートして <?xml version="1.0" encoding="UTF-8" ?> <ROOT>  <CONTENTS>   (略)  </CONTENTS>  <ITEMS>   <ITEM>    <TITLE>DEF</TITLE>    <NUMBER>0</NUMBER>   </ITEM>   <ITEM>    <TITLE>ABC</TITLE>    <NUMBER>10</NUMBER>   </ITEM>   <ITEM>    <TITLE>JKL</TITLE>    <NUMBER>50</NUMBER>   </ITEM>   <ITEM>    <TITLE>GHI</TITLE>    <NUMBER>100</NUMBER>   </ITEM>  </ITEMS> </ROOT> というようにしたいです。 XSLなどでできるのでしょうか? Excel2003のVBAでMSXMLを使っています。

    • ベストアンサー
    • XML
  • XML::XPath -- 追加したノードが見付からない

    XMLのテンプレートを既存のXMLに追加したのですが、 その後 findnodes() で検索しても合致しません。 XML::XPath::Node::Element->new() を使って作成したものは 合致してくれます。 XML::XPath::XMLParser でパースしたものを追加して findnodes() で合致させるにはどのようにしたらよいのでしょうか。 ------------------------------- use XML::XPath; #### 元のXML my $xmldata = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list>   <item>orange</item>   <item>apple</item>   <item>lemon</item> </list> EOM ### 追加するXMLのテンプレート my $xmlappend = <<EOM;   <item>pine</item> EOM ## 追加先ノードを取り出す my $xml = XML::XPath->new( xml=>$xmldata ); my ($list) = $xml->findnodes('/list'); ## 追加用XMLを作成して追加 my $append = XML::XPath::XMLParser->new( xml=>$xmlappend )->parse; $list->appendChild( $append ); ## もういっこ追加。こちらはこの場で作る $newnode = XML::XPath::Node::Element->new('item'); $newtext = XML::XPath::Node::Text->new('banana'); $newnode->appendChild( $newtext ); $list->appendChild( $newnode ); ## 現状確認 → pine は入っていた print $list->toString."\n"; ## item一覧を取得 @nodes = $xml->findnodes('/list/item'); ## 一覧を出力 → 追加した pine が出力されない。 bananaはある。 map{ print $_->toString."\n" } @nodes;

    • ベストアンサー
    • Perl
  • LibXMLのエラーについて

    こんにちは。 XMLファイルを読み込む処理をテストしているのですがlibXMLが動作してくれません。 次の手順でインストール~実行したのですが何がいけないのでしょうか? どこか問題点がありましたら教えてください。 LibXMLは「/usr/local/lib/perl/5.8.4/auto/XML/LibXML」に見えます。 (perlを始めたばかりなので他に必要な情報がありましたらコメント下さい。) 1.libxml2-2.6.23.tar.gzをインストール 2.CPANでXML::LibXML、関連モジュールをインストール 3.次のコードを実行 #!/usr/local/bin/perl use XML::LibXML; my $parser = XML::LibXML->new; my $xmlfile = $parser->$contents; print Dumper($xmlfile)."\n"; ※$contentsには単純なXMLフォーマットのデータが入っています。 4.エラーが表示される Can't locate auto/XML/LibXML/<?xml version="1.0" encoding="euc-jp" ?> : :(XMLファイルの内容) : .al in @INC (@INC contains: perllib /etc/perl /usr/local/lib/perl/5.8.4 /usr/local/share/perl/5.8.4 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at perllib/testperl.pm line 10

    • ベストアンサー
    • Perl
  • XMLのソート(再)

    XMLのソート(再) http://okwave.jp/qa/q6069966.html に足りない部分があったので訂正して再質問します。 このようなXMLがあります <?xml version="1.0" encoding="UTF-8" ?> <ROOT>  <CONTENTS>   (略)  </CONTENTS>  <DATASET>   <DATA1>A</DATA1>   <DATA2>B</DATA2>   (略)   <ITEMS>    <ITEM>     <TITLE>ABC</TITLE>     <NUMBER>10</NUMBER>    </ITEM>    <ITEM>     <TITLE>DEF</TITLE>     <NUMBER>0</NUMBER>    </ITEM>    <ITEM>     <TITLE>GHI</TITLE>     <NUMBER>100</NUMBER>    </ITEM>    <ITEM>     <TITLE>JKL</TITLE>     <NUMBER>50</NUMBER>    </ITEM>   </ITEMS>  </DATASET> </ROOT> これを、/ITEMS/ITEM/NUMBER でソートして <?xml version="1.0" encoding="UTF-8" ?> <ROOT>  <CONTENTS>   (略)  </CONTENTS>  <DATASET>   <DATA1>A</DATA1>   <DATA2>B</DATA2>   (略)   <ITEMS>    <ITEM>     <TITLE>DEF</TITLE>     <NUMBER>0</NUMBER>    </ITEM>    <ITEM>     <TITLE>ABC</TITLE>     <NUMBER>10</NUMBER>    </ITEM>    <ITEM>     <TITLE>JKL</TITLE>     <NUMBER>50</NUMBER>    </ITEM>    <ITEM>     <TITLE>GHI</TITLE>     <NUMBER>100</NUMBER>    </ITEM>   </ITEMS>  </DATASET> </ROOT> というようにしたいです。 XSLなどでできるのでしょうか? <DATA1>…は実際には様々なデータがあり、その中で階層になっているものもあります。 Excel2003のVBAでMSXMLを使っています。

    • ベストアンサー
    • XML

専門家に質問してみよう