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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
同じタグ名の項目取得
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
replaceChildメソッドについて
-
ツリービューのノードをダブル...
-
カウントアップ
-
2分探索木の高さを求めるプロ...
-
あるノードリストに、特定の名...
-
VB2005 TreeViewの任意ノード選択
-
(VB.NET)TreeViewのノード文...
-
C# TreeView 効率良いノード追...
-
TreeViewの再表示のちらつきを...
-
多分木のプログラミングについて
-
バッチファイルでテキストファ...
-
getElementsByNameの要素数が取...
-
東芝のDynabookなのですがアン...
-
VB6でXMLを処理するには
-
動的な構造体配列の初期化
-
DOSコマンドラインからxmlファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
昔Winnyってありましたけど、あ...
-
同じタグ名の項目取得
-
TreeViewに重複する値をセット
-
あるノードリストに、特定の名...
-
VB6.0でDOMを使用して...
-
ツリービューのノードをダブル...
-
2分探索木の高さを求めるプロ...
-
ノードとは
-
vbsのDOMDocumentで要素のText...
-
TreeView の初期表示について
-
二分木の高さについて
-
C#でTreeViewのCheckBoxのサイ...
-
複数のマックPCによる数値計算...
-
C# TreeView 効率良いノード追...
-
コンテキストメニュークリック...
-
C#でtreeviewの指定ノードを選...
-
replaceChildメソッドについて
おすすめ情報