プロが教える店舗&オフィスのセキュリティ対策術

フォームからキーワードを受け取り、それを、xmlを参照しながらphpで出力したいのですが、最後の最後でつまずきます。
------------------
<?php
$doc = new domDocument();
// DOMDocumentオブジェクトにより、インスタンスを生成
$doc->load("./beta.xml");
// ファイルからXML文書を読みこむ
$kywd = $_REQUEST['kywd'];
// フォームからデータを受け取る
$nodelist = $doc->getElementsByTagName('keyword');
// 指定した要素名(keyword)の全ての要素を取得
foreach ($nodelist as $node) {
// 各要素を参照
if($kywd == $node->textContent){
// もし、フォームから受け取ったデータが要素と一致したら
$xurl = $node->namespaceURI;
// 要素の名前空間URLを取得して$xurlに代入
$xml = simplexml_load_file("./beta.xml");
// SimpleXMLによってXMLファイルをパースし、simplexml_elementオブジェクトを作成する
$parent = $xml->children("$xurl");
// 指定したノードの子ノードの配列を取得
$hairetsu = $parent[0]->children("$xurl");
//取得した配列素$hairetsuに代入

foreach($hairetsu as $key=>$value) {
// ちゃんと連想配列になっているか、ためしに出力
print ($key."→".$value."<br />");
}
// 連想配列になっていることを確認
print $hairetsu["title"];
// しかし、キーを指定して値を取得しようとすると、なぜか得られない。
}
}
?>
問題は最後のほうです。連想配列になっていることは確かに確認できる(titleというキーも、その値もある)のですが、連想配列のキーから値を参照しようとすると、なぜか値がNULLになっていて表示できません。私は趣味でプログラミングをする程度なので、おそらく基本的なところで間違っているのだと思いますが、それがどこだか分かりません。お教え願えないでしょうか。

A 回答 (2件)

#1>「キーワード」を参照して「タイトル」を得たい


余計なお世話かもしれませんが、
この場合、「タイトル」は、キーワードの親ノードの子ノードなので、いちいち、名前空間で限定する必要は無いように思います。
そして、DOMだけで操作できます。
例えばこんな感じ。
----------------------------------------------------------------
<?php
#encoding UTF-8
$doc = new domDocument();
$doc->load("./beta.xml");
$kywd = 'ポータルサイト';#$_REQUEST['kywd'];
$nodelist = $doc->getElementsByTagName('keyword');
foreach ($nodelist as $node) {
if($kywd == $node->nodeValue){
$titles = $node->parentNode->getElementsByTagName('title');
$title = $titles->item(0)->nodeValue;
print mb_convert_encoding($title,"SJIS","UTF-8") . "\n";#必要に応じて文字コード変換
}
}
?>
----------------------------------------------------------------
元のプログラム(を試してはいませんが)でうまくいかない理由は、多分文字コードに起因するもの、あるいはsimpleXMLの構造の勘違いではないかと思います。
    • good
    • 0
この回答へのお礼

おお!できました!
なにぶん、プログラミング初心者なので、私の知識では質問したプログラム以外の手段が思いつかなかったのです。
私も、「我ながら回りくどいプログラムだなー」と思っていたので本当に助かりました!ありがとうございました。

お礼日時:2006/08/06 16:12

beta.xml を補足していただけないでしょうか

この回答への補足

すいません。字数制限のために書き込めないでいました。
-----
[beta.xml]

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<sites>
<uri:site xmlns:uri="http://www.yahoo.co.jp/">
<uri:title>ヤフー</uri:title>
<uri:keyword>ポータルサイト</uri:keyword>
<uri:keyword>ヤフージャパン</uri:keyword>
</uri:site>
<uri:site xmlns:uri="http://www.google.co.jp/">
<uri:title>グーグル</uri:title>
<uri:keyword>ポータルサイト</uri:keyword>
<uri:keyword>ぐーぐる</uri:keyword>
</uri:site>
<uri:site xmlns:uri="http://www.msn.co.jp/">
<uri:title>MSN</uri:title>
<uri:keyword>portal</uri:keyword>
<uri:keyword>エムエスエヌ</uri:keyword>
</uri:site>
</sites>

------------

例えば、フォームから「ポータルサイト」というキーワードを受け取ったときに、「キーワード」と言う<uri:keyword>を持っているノードと同じ名前空間URIをもつ<uri:title>の要素(この場合、「ヤフー」と「ぐーぐる」)を取り出したいのです。簡単に言えば、「キーワード」を参照して「タイトル」を得たいのです。

補足日時:2006/08/06 07:26
    • good
    • 0
この回答へのお礼

すいません。まだ「教えてgoo」でID取ったばかりで、使い方をよく理解していないのですが、「補足」に書いた内容が間違っていたので訂正します

------------

例えば、フォームから「ポータルサイト」というキーワードを受け取ったときに、「キーワード」と言う<uri:keyword>を持っているノードと同じ名前空間URIをもつ<uri:title>の要素(この場合、「ヤフー」と「グーグル」(「ぐーぐる」ではない))を取り出したいのです。簡単に言えば、「キーワード」を参照して「タイトル」を得たいのです。

お礼日時:2006/08/06 10:04

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