simpleXMLを使ったnamespase付きxmlのパースでハマったのでメモ。
パースするxmlを文字列として$strに代入。
$str = <<<XML <html xmlns="http://www.w3.org/TR/xhtml1"> <body> <p>test</p> </body> </html> XML;
$strに代入した文字列をSimpleXMLElementオブジェクト化する。
$xml = new SimpleXMLElement($string);
simpleXMLElementのregisterXPathNamespaceでnamespaceを登録する。第一引数はnamespaceプレフィックス。こういうの<prefix:html>とかこういうやつ<xml:html>。たぶんここは適当でいい。第二引数はパースするxmlのnamespace。
$xml->registerXPathNamespace("xhtml", "http://www.w3.org/TR/xhtml1");
xpathで検索する時は先のプレフィックス付きで渡す。
$p = $xml->xpath("//xhtml:p"); echo $p[0];
結果は
test
なんかnamespaceって仕様があとづけっぽくて肌が合わない。