从SimpleXMLElement读取CDATA,使用simplexml_import_dom创建

时间:2013-10-31 09:55:37

标签: php xml simplexml domdocument cdata

我有一部分我正在尝试解析的XML文件。由于它只是XML文件的一个片段,因此它的标记不会被关闭,并被视为无效标记。因此,我使用DOMDocument::loadHTMLsimplexml_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节点而不是

0 个答案:

没有答案