でも、たまにAPIによってはxmlでしか返ってこないことがあり、phpのSimpleXMLをつかってパースを必要が出てきたするのだけど、"dc:date" のようにコロンがついている要素は処理に一工夫しないとうまく取得できなかったりする。
$xml = simplexml_load_file($url);
echo $xml->item[0]->dc:date; // これでは表示されない
で、いろいろ調べてみた結果、コロン自体を置換等で消してしまう方法とchildrenメソッドで名前空間を指定してあげる方法があるようです。
(1)「:(コロン)」を置換する
具体的にはこんな感じ。データを取得するだけなのだから方法としては悪くないのかなぁと思った。
$xml_tmp = file_get_contents($url);
$xml_tmp = str_replace(":", "_", file_get_contents($xml_tmp));
$xml = simplexml_load_string($xml_tmp);
echo $xml->item[0]->dc_date;
(2)childrenメソッドを使う
こっちのほうがいいのかなと思って結局、この前つまづいたときはこっちにしました。
php.net - children
つまりは名前空間を定義しているURLを children メソッドに渡すか、prefixを渡すかのよう。
dc (Dublin Core) 名前空間は xmlns:dc="http://purl.org/dc/elements/1.1/" と宣言されてたのでこれを引数として渡して値を取得。
$xml = simplexml_load_file($url);
$i = 1;
while (isset($xml->item[$i]->title)) {
$arr['item'][$i]['title'] = htmlspecialchars($rdf->item[$i]->title);
$node = $rdf->item[$i]->children('http://purl.org/dc/elements/1.1/');
$arr['item'][$i]['date'] = htmlspecialchars($node->dc);
$i++;
}
print_r($arr);
prefixを渡す場合は試してないけど、
「$rdf->item[$i]->children('http://purl.org/dc/elements/1.1/');」のところを
「$rdf->item[$i]->children('dc', true);」
に変えればいいのかな?
参考:PHPでコロンを含むXML要素名を扱う方法
また、属性内(attributes)の要素にアクセスするにはそのままattributesメソッドを使った。
echo (string)$xml->item[$i]->attributes()->Name;
echo (int)$xml->item[$i]->attributes()->Number;
xml、難しいっすね。。
0 件のコメント:
コメントを投稿