私はxmlfileを持っています:
$xml = <<<EOD
<?xml version="1.0" encoding="utf-8"?>
<metaData xmlns="http://www.test.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test">
<qkc6b1hh0k9>testdata&more</qkc6b1hh0k9>
</metaData>
EOD;
今私はそれをsimplexmlobjectにロードし、後で「qkc6b1hh0k9」ノードの内部を取得したかった
$xmlRootElem = simplexml_load_string( $xml );
$xmlRootElem->registerXPathNamespace( 'xmlns', "http://www.test.com/" );
// ...
$xPathElems = $xmlRootElem->xpath( './'."xmlns:qkc6b1hh0k9" );
$var = (string)($xPathElems[0]);
var_dump($var);
文字列を取得することを期待していました
testdata&more
...しかし、私は得ました
testdata&more
- simplexmlobject の __toString() メソッドが、エスケープされた特殊文字を通常の文字に変換するのはなぜですか? この動作を無効にすることはできますか?
私は一時的な解決策を思いつきましたが、それは汚いと思いますが、どう思いますか?
(strip_tags($xPathElems[0]->asXML()))
DOMDocument が代わりになることはありますか?
私の質問に助けてくれてありがとう!
編集
問題は解決しました。問題は simplexml の __toString メソッドにはありませんでした。後で addChild で文字列を使用したときに発生しました。
上記の動作はまったく問題なく、回答でわかるように期待する必要があります...
「addChild」を介して値が別のxmlドキュメントに追加されたときにのみ問題が発生しました。addChild はアンパサンド ( http://www.php.net/manual/de/simplexmlelement.addchild.php#103587 )をエスケープしないため、手動で行う必要があります。