のみのlibxml2ベースのXMLパーサ(SimpleXMLは、DOM、XMLReaderの)を使用しないことによって。それらはすべて事前定義されたエンティティの置換を強制します。 LibXML2 documentationから
:
ノート保存時のlibxml2で整形 問題を防止するために必要な 定義済みエンティティの変換を強制し、また透過的に文字を有するものを置き換えること(すなわち それはDOMツリー内にエンティティ参照要素を生成しません。または入力内で参照()SAXコールバックを呼び出す場合は を呼び出します。
XMLパーサーの場合、 '/'と '+'は等しいです。エンティティをXMLに格納するには、&
をエスケープする必要があります。あなたはDOMのテキストノードとして、それを作成する場合は、DOMシリアル化のためにそれを行うだろうことがわかります。
$document = new DOMDocument();
$document
->appendChild($document->createElement('CATEGORY_TREE'))
->appendChild($document->createTextNode('/Gry/Puzzle/puzzle/'));
echo $document->saveXml();
出力:
<?xml version="1.0"?>
<CATEGORY_TREE>/Gry&#47;Puzzle/puzzle/</CATEGORY_TREE>
出典
2016-10-06 14:37:22
ThW
私は私が言及するのを忘れてしまったと思うが、私は、XMLを解析しています、それを作成しません。 – Grzegorz
私はそれを理解しましたが、XMLパーサーの '/'と '+ 'は同じです。 '/ Gry/Puzzle/puzzle /'は生の値です(少なくともlibxml2ベースのXMLパーサでは)。エンティティとして '+'を読みたい場合は、プログラム/スクリプトがエンティティをエンコードするのが最善の解決策です。それ以外の場合は、既定のエンティティまたは文字列関数(別名独自のパーサーを作成する)で置き換えられないXMLパーサを使用する必要があります。この場合、他の問題に備えて準備をしてください。 LibXML2で置き換えられる理由は次のとおりです。 – ThW