解析しようとしている XML ファイルの一部があります。これは XML ファイルのフラグメントにすぎないため、タグが閉じられておらず、無効なマークアップと見なされます。DOMDocument::loadHTML
したがって、との組み合わせを使用しsimplexml_import_dom
て、XML を使用可能な SimpleXMLElement オブジェクトに変換しますxpath
(プロジェクトにとって重要です)。
すべて正常に動作しますが、CDATA タグでラップされた値を取得できません。何時間ものデバッグの後、CDATA セクションが呼び出されると失われるように思えますDOMDocument::loadHTML()
。これが私の方法です:
$xmlString = "
<items>
<item>
<title><![CDATA[Lipsum]]></title>
<uid><![CDATA[21108541]]></uid>
<description><![CDATA[Lorem ipsum dolor sit amet.]]></description>
</item>
<item>
<title><![
";
..
$dom = new DOMDocument();
$dom->strictErrorChecking = false;
libxml_use_internal_errors(true);
$dom->loadHTML($xmlString);
// Traverse into the <body> tag DomDocument has wrapped my XML in
$xml = simplexml_import_dom($dom->documentElement->childNodes->item(0));
// Traverse further to the item I need (in my project the xpath is variable)
$item = $this->xml->xpath("items/item");
foreach ($item[0] as $child) {
echo $child->getName(); // This much works, returns "title uid description"
echo (string) $child; // This doesn't, returns empty string ""
}
dom_import_xml($child)
ノード内で CDATA セクションを見つけようとしましたが、成功しませんでした。loadHTML()
CDATA ビットの後のどの時点でも、その中のすべてがどこにも見つからないように見えます。
スタックオーバーフローの他の解決策には、インスタンスLIBXML_NOCDATA
の作成時に定数を渡すことが含まれますが、そのようなパラメーターは受け入れられません。しますが、代わりに空の DOMText ノードを返しますSimpleXMLElement
simplexml_import_dom
DOMDocument::loadHTML()