0

解析しようとしている 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 ノードを返しますSimpleXMLElementsimplexml_import_domDOMDocument::loadHTML()

4

0 に答える 0