- ベストアンサー
PHPを使ったDOM操作で兄弟ノードへ移動する方法
- PHPを使ったDOMの操作で兄弟ノードへ移動する方法について教えてください。
- PHPを使ったDOMの操作でxml文書から要素を抽出する際、兄弟ノードへの移動の仕方が分かりません。
- <item>要素を上に追加するために、現在の<item>の上の兄弟ノードへの移動方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2>nextSiblingを使えばどうにかなるのではないか そうですね、普通、DOMでは、nextSibling を使うと思います。 試しにnextSibling を使って次のエレメントを取り出そうとしてみましたが、失敗しました。 多分、バグなんじゃないかと思います。 そうも言ってられないですけど #2>出来れば一つの<item>要素のデータを取り出したあと、一つ古い(一つ下の)<item>の情報の<link>要素も取り出したいと考えています。 <item> 要素については、 $items=$doc->getElementsByTagName("item"); でそのノードリストが取り出せるし、 個々の<item> 要素は $items->item(index) で取り出せます。(要するに任意の位置のitem が取り出せる) また、<item> の全体の要素数は $len = $items->length; で取り出せます。 そうすれば、 $items=$root->getElementsByTagName("item"); $len = $items->length; $i=0; foreach($items as $item){ $i++; if($i<$len){ $next=$items->item($i); として、処理している$itemの次の<item> を捕まえられます。
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>RSSにおいて、itemの順番には意味があるのでしょうか?新しい情報ほど上に書かなければならないと思ったのですが、別に逆順でもいいのでしょうか? あんまり詳しいわけではないですが、 http://www.net.intap.or.jp/INTAP/s-web/data/TR/1-2.html なんかを読むと、<item>要素が新しいモノから順という縛りはないみたいですね。 <items><rdf:Seq>についても、単に目次であって、順序を示すものではないと言及されていますね。 それぞれの<item>が新しいかどうかは、 <item><dc:date>でわかりますから、順序についての記述は必要ないし反って余計な制限になるような気がします。 RSSファイルを作成する場合、新しい項目を既存のファイルに追加するというより、指定された期間のファイルか、(新しいモノから)指定された数のファイルで新たに作るということが普通なんじゃないかと思います。
補足
私もRSSについてネットで調べてみました。すると、確かに<pubDate>要素に書かれた日付によって、RSSリーダーは公開順に並べなおしてくれるそうです。ただ、日付を参照しないRSSリーダーもあり、その場合は上のほうの<item>要素からしかデータを読み込まないそうなんです。また、新しい<item>情報を上に追加していっているRSSが多く、私も出来れば上のほうに<item>を追加したいんです。事情がありまして、出来れば一つの<item>要素のデータを取り出したあと、一つ古い(一つ下の)<item>の情報の<link>要素も取り出したいと考えています。 <?php $doc = new domDocument(); $doc->load("○○.xml"); $nodelist = $doc->getElementsByTagName('link'); foreach ($nodelist as $node){ if("http://www.~~/02/" == $node->nodeValue){ $link = $node->nodeValue; $titles = $node->parentNode->getElementsByTagName('title'); $work_title = $titles->item(0)->nodeValue; $ps = $node->parentNode->getElementsByTagName('p'); ?> 以上のように、各要素を変数に代入して、あとから参照していこうと考えています。上記のプログラミングまではできたのですが、「一つ古い(一つ下の)<item>要素の<link>を参照する」方法が思いつかないんです。素人考えで、nextSiblingを使えばどうにかなるのではないかと思い、色々試したのですが、できませんでした。「一つ下の<item>要素を参照する」というのは不可能なのでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ちょっとよくわからないところがあるんですが、 item を順番にアクセスするというのであれば、 $items=$root->getElementsByTagName("item"); foreach($items as $item){ の様にアクセスすればいいかと思います。
補足
すいません。質問の仕方が悪いですね。私も混乱してきました。私がやりたいのは、要するに、RSSを解析してphpで出力したいと言うことなんですが……。とりあえず、ちょっと質問を変えてひとつずついきます。RSSにおいて、itemの順番には意味があるのでしょうか?新しい情報ほど上に書かなければならないと思ったのですが、別に逆順でもいいのでしょうか?
お礼
結局、素直に任意の値から取り出すことにしました。 長々と素人に付き合ってくださってありがとうございました。