

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サービス構築」は持っています)もあれば教えてください。よろしくお願いします。
No.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> を捕まえられます。
No.2
- 回答日時:
#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>要素を参照する」というのは不可能なのでしょうか?
No.1
- 回答日時:
ちょっとよくわからないところがあるんですが、
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お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同じタグ名の項目取得
-
SNMP リンクダウンとノードダ...
-
TreeView の初期表示について
-
ルート要素ノードが2個ある場合?
-
CPUの考え方を教えてください ...
-
各ノードの行数取得
-
TreeVIewのノード名を編集する...
-
ツリービューのノードをダブル...
-
C# TreeView 効率良いノード追...
-
ToolStripMenuItemの選択(VB)
-
TreeViewのノードの編集結果が...
-
ノードとは
-
TreeViewで複数ノードの選択は...
-
VB2005 TreeViewの任意ノード選択
-
あるノードリストに、特定の名...
-
ツリーでのアイコンの設定
-
XML文書の指定した属性値を持つ...
-
TreeViewに重複する値をセット
-
Ciscoルータやスイッチを使用し...
-
RSSからblog(ブログ)の本文を抽...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
複数のマックPCによる数値計算...
-
同じタグ名の項目取得
-
C# TreeView 効率良いノード追...
-
C#でTreeViewのCheckBoxのサイ...
-
昔Winnyってありましたけど、あ...
-
2分探索木の高さを求めるプロ...
-
ツリーでのアイコンの設定
-
各ノードの行数取得
-
ツリービューのノードをダブル...
-
ノードとは
-
TreeVIewのノード名を編集する...
-
あるノードリストに、特定の名...
-
最短路問題について
-
TreeViewコントロールについて
-
XML::LibXMLのfindnodes()で、...
-
XML文書の指定した属性値を持つ...
-
ツリービューの使い方が・・・
おすすめ情報