我有一部分我正在尝试解析的XML文件。由于它只是XML文件的一个片段,因此它的标记不会被关闭,并被视为无效标记。因此,我使用DOMDocument::loadHTML
和simplexml_import_dom
的组合将我的XML转换为可以使用xpath
的SimpleXMLElement对象(对项目很重要)。
一切正常,但我无法获取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位之后的任何时刻,其中的所有内容似乎无处可寻。
stackoverflow上的其他解决方案包括在创建LIBXML_NOCDATA
实例时传递SimpleXMLElement
常量,但simplexml_import_dom
不接受此类参数。 DOMDocument::loadHTML()
会这样做,但它会返回空的DOMText节点而不是