PHPでXPathのノードを文字列に変換(string関数もどき)
XPathにはノードを文字列に変換するためのstring()という関数がありますが、PHP(のSimpleXML)ではうまく動作しなかったため、SimpleXML::asXML()等を利用してstring()関数と同等の動作を再現してみました。
期待する結果(通常のXPath)
- XML
<?xml version="1.0"?> <basket> <item>Apple</item> <item>Banana</item> <item>Orange</item> </basket>
上記のXMLに対して、下記のXPath式を評価します。
- XPath
//basket[string()]
通常は以下のような結果が返ってきます。
- 結果
Apple Banana Orange
PHPでXPathのstring()関数もどき
PHP(のSimpleXML)では、上記のXPath式は期待した結果を返さないか、式によっては例外が発生します。そこでSimpleXML::asXML()とstrip_tags()を利用して、期待する結果が返るようにしてみました。
$xml = <<<XML
<?xml version="1.0"?>
<basket>
<item>Apple</item>
<item>Banana</item>
<item>Orange</item>
</basket>
XML;
$simplexml = simplexml_load_string($xml);
$string = $simplexml->xpath('//basket');
$string = $string[0]->asXML();
// new SimpleXMLElement() でSimpleXMLオブジェクトを生成している場合はXML宣言を除去
// (すぐにstrip_tags()する場合は、strip_tags()で除去されるので不要)
// $string = preg_replace('!^<\?xml\s+(?:[^\'"?]|"[^"]*"|\'[^\']*\')*\?>\s*!', '', $string);
// タグ前後の空白文字を除去する場合
// $string = preg_replace('!\s*(</?(?:[^\'">]|"[^"]*"|\'[^\']*\')*>)\s*!', '$1', $string);
$string = strip_tags($string);
複数のノードセットがある場合はさらに工夫が必要ですが、以上でPHPでもXPathのstring()関数と同等の結果が得られるようになりました。
トラックバック (0)
この記事へのトラックバックはまだありません。
コメント (0)
この記事へのコメントはまだありません。