using simpleXML to parse xml with namespace

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って仕様があとづけっぽくて肌が合わない。