エンティティ参照を含むXML行の読み込み( など)

挑戦する

XSLTテンプレートを使用するシステムでは、コンテンツ所有者が などの使い慣れたエンティティ名を簡単に使用できるようになります。 — など  、 のようなデジタル定義は必要ありません。 またはCDATAに特殊文字を配置する



問題

データベースからXMLに多くのブロックを読み込むと、次の問題が発生しました:パーサーは、説明されていないエンティティを次のように誓いました:「Entity:line 1:parser error:Entity 'yen' not defined」。



解決策

エンティティの説明を含む行を読み込むときにこのような問題を回避するには、彼が私たちに期待すること、つまり これらのエンティティを説明してください。



ロード行は次のようになります。

<!DOCTYPEルート[

<!ENTITY nbsp "&#160;">

<!ENTITY yen "&#165;">

]>

<text>怒りとnbsp; 邪悪な実体と円を含むテキスト; </ text>




10回運動しないようにするために、必要なすべての名前のリストを持つファイルを1回ピックアップできます。

$エンティティ= file_get_contents(PATH_SYS。 'templates / symbols.ent');




次のように機能します。



ロードするラインを準備する

$ block_content = '<!DOCTYPEルート['。 $エンティティ。 ']> <text>'。$ block_content。 '</ text>';





DOMDocument :: loadXMLメソッドの使用:

$ dom_child_doc = DOMDocument :: loadXML($ block_content、LIBXML_NOENT);

$ block_content_node = $ blockDoc-> importNode($ dom_child_doc-> lastChild、true);

$ block = $ blockDoc-> blocks-> appendChild($ block_content_node);




simplexml_load_string関数を使用する:

$ xml = simplexml_load_string($ block_content、 'SimpleXMLElement'、LIBXML_NOENT);

$ dom_sxe = dom_import_simplexml($ xml);

$ block_content_node = $ blockDoc-> importNode($ dom_sxe、true);

$ block = $ blockDoc-> blocks-> appendChild($ block_content_node);


$ blockDocは、ブロックを追加する特定のDOMDocumentオブジェクトです。

$ blockDoc-> blocks-すべてのブロックを配置するこのドキュメントのノード

すべてのエンティティ名を必要な文字に直接変換する必要がある場合は、ラインローダーのオプション「LIBXML_NOENT-エンティティの変換」を設定することを忘れないでください。



All Articles