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)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/214/trackback/
この記事のURI
http://dxd8.com/archives/214/