公式アカウントからの投稿が始まります

PHPを使ったDOMの操作でxml文書から要素を抽出したいのですが、兄弟ノードへの移動の仕方が分かりません。
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>○○○</title>
<link>×××</link>
<item>
<title>更新2つ目</title>
<link>http://www.~~/02/</link>
<description>
<p>文書2</p>
</description>
<category>エッセイ</category>
</item>
<item>
<title>更新1つ目</title>
<link>http://www.~~/01/</link>
<description>
<p>文書1</p>
</description>
<category>エッセイ</category>
</item>
</channel>
</rss>
例えば、以上のような場合、後々<item>を更に現在ある一番上の<item>の上に追加していくことを考えて、現在(上)の<item>の部分から直に次(下)の<item>へカレントノードを移動させることは可能でしょうか?参考書を読みながら現在(上)の<item>から<link>要素は取り出せたのですが、「次(下)にくる<item>の<link>をとりだす」方法が、最上位のルート要素を経由し、そこから何個目の<link>か数えてから取り出す方法しか分かりません。それでは後に(<link>を内包した)<item>を追加することを考えると、順番が変わってきてしまうので、参照したい<link>が変わってしまう事になります。
検索して調べようと思ったのですが、PHPによるDOMの操作の情報が見つかりませんでした。やり方を知っている方がいれば教えて欲しいです。また、PHPによるDOMの操作について詳しく載っているサイトや書籍(「PHP5&XMLによるWebサービス構築」は持っています)もあれば教えてください。よろしくお願いします。

A 回答 (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> を捕まえられます。
    • good
    • 0
この回答へのお礼

結局、素直に任意の値から取り出すことにしました。
長々と素人に付き合ってくださってありがとうございました。

お礼日時:2006/08/09 12:05

#1>RSSにおいて、itemの順番には意味があるのでしょうか?新しい情報ほど上に書かなければならないと思ったのですが、別に逆順でもいいのでしょうか?


あんまり詳しいわけではないですが、
http://www.net.intap.or.jp/INTAP/s-web/data/TR/1 …
なんかを読むと、<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>要素を参照する」というのは不可能なのでしょうか?

補足日時:2006/08/08 14:46
    • good
    • 0

ちょっとよくわからないところがあるんですが、


item を順番にアクセスするというのであれば、
$items=$root->getElementsByTagName("item");
foreach($items as $item){
の様にアクセスすればいいかと思います。

参考URL:http://okwave.jp/kotaeru.php3?qid=2145955

この回答への補足

すいません。質問の仕方が悪いですね。私も混乱してきました。私がやりたいのは、要するに、RSSを解析してphpで出力したいと言うことなんですが……。とりあえず、ちょっと質問を変えてひとつずついきます。RSSにおいて、itemの順番には意味があるのでしょうか?新しい情報ほど上に書かなければならないと思ったのですが、別に逆順でもいいのでしょうか?

補足日時:2006/08/07 23:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!