我有一部分要解析的 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_NOCDATA
stackoverflow 上的其他解决方案包括在创建实例时传递常量SimpleXMLElement
,但simplexml_import_dom
不接受这样的参数。DOMDocument::loadHTML()
确实如此,但它随后返回空的 DOMText 节点