PHPでコロンを含むXML要素名を扱う方法

(1/1)
いままで XML を扱う際に、PHP4.x では DOM XML を、PHP5.x では SimpleXML を利用してきた。
これらは便利な関数群だが、XML要素名にコロン「」を含む場合、そのままでは扱うことができない。たとえば RSS 1.0 では、"dc:date" のように、コロンを含む要素名があり、処理に工夫が必要だ。
space
今回は、要素名にコロン「」を含む XML の扱い方を紹介する。

サンプル・プログラム「RSS 1.0 ビューア」

RSS1.0(RDF)を読み込み、その内容を表示するプログラムである。
冒頭で述べたように、コンテンツの更新日を示す要素 "dc:date" の処理で工夫が必要だ。

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説:DOM XMLの場合

RSS1.0 の内容を配列変数に格納するユーザー関数が getRDF である。
内部では、PHP 4.x の場合と PHP 5.x の場合とで処理を分岐させている。
space
関数  get_elements_by_tagname  では、要素名にコロンを含む場合、コロンの右側を認識する。そこで、get_elements_by_tagname('date') としてやれば、要素 "dc:date" の値を取得することができる。
space
なお、配列変数  $arr:blue] に代入する際にいちいち関数 htmlspecialchars  を適用しているのは、クロスサイトスクリプティング対策のためである。

0065:         $dom = read_xml($url);       //DOM XML利用
0066:         if (($rdf = $dom->get_elements_by_tagname('RDF')) == NULLreturn FALSE;
0067:         //channel情報の取得
0068:         $channel = $rdf[0]->get_elements_by_tagname('channel');
0069:         $node    = $rdf[0]->get_elements_by_tagname('title');
0070:         $arr['channel']['title'] = htmlspecialchars($node[0]->get_content());
0071:         $node    = $rdf[0]->get_elements_by_tagname('link');
0072:         $arr['channel']['link'] = htmlspecialchars($node[0]->get_content());
0073:         $item    = $rdf[0]->get_elements_by_tagname('item');
0074:         //item情報の取得
0075:         $i = 0;
0076:         while (isset($item[$i])) {
0077:             $node = $item[$i]->get_elements_by_tagname('title');
0078:             $arr['item'][$i]['title']       = htmlspecialchars($node[0]->get_content());
0079:             $node = $item[$i]->get_elements_by_tagname('link');
0080:             $arr['item'][$i]['link']        = htmlspecialchars($node[0]->get_content());
0081:             $node = $item[$i]->get_elements_by_tagname('description');
0082:             $arr['item'][$i]['description'] = htmlspecialchars($node[0]->get_content());
0083:             $node = $item[$i]->get_elements_by_tagname('date');
0084:             $arr['item'][$i]['date']        = htmlspecialchars($node[0]->get_content());
0085:             $i++;
0086:         }

サンプル・プログラムの解説:SimpleXMLの場合

SimpleXML の場合、"$rdf->item[$i]->dc:date" では要素の内容を取得することができない。children メソッドを使う必要がある。
space
children メソッドは、引数に名前空間を指定する必要がある。RSS 1.0 では、dc の名前空間は
xmlns:dc="http://purl.org/dc/elements/1.1/"
と定義されているので、これを引数として指定する。
space
children メソッドで子ノード $node を取得したら、"$node->dc" と指定することで、要素 "dc:date" の内容を取り出すことができる。

0090:         $rdf = simplexml_load_file($url);    //SimpleXML 利用
0091:         if ($rdf == FALSE)  return FALSE;
0092:         //channel情報の取得
0093:         $arr['channnel']['title'] = htmlspecialchars($rdf->title);
0094:         $arr['channnel']['link']  = htmlspecialchars($rdf->link);
0095:         //item情報の取得
0096:         $i = 1;
0097:         while (isset($rdf->item[$i]->title)) {
0098:             $arr['item'][$i]['title']        = htmlspecialchars($rdf->item[$i]->title);
0099:             $arr['item'][$i]['link']         = htmlspecialchars($rdf->item[$i]->link);
0100:             $arr['item'][$i]['description']  = htmlspecialchars($rdf->item[$i]->description);
0101:             $node = $rdf->item[$i]->children('http://purl.org/dc/elements/1.1/');
0102:             $arr['item'][$i]['date']         = htmlspecialchars($node->dc);
0103:             $i++;
0104:         }

参考サイト

参考書籍

(この項おわり)
header