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 部分,但没有成功。在 CDATA 位之后的任何时候,loadHTML()其中的所有内容似乎都无处可寻。

LIBXML_NOCDATAstackoverflow 上的其他解决方案包括在创建实例时传递常量SimpleXMLElement,但simplexml_import_dom不接受这样的参数。DOMDocument::loadHTML()确实如此,但它随后返回空的 DOMText 节点

4

0 回答 0