PHP:如何处理<![CDATA [使用SimpleXMLElement?

Ang*_*elo 93 php xml tags cdata

我注意到,当SimpleXMLElement在包含那些CDATA标签的文档上使用时,内容始终是NULL.我该如何解决?

另外,抱歉在这里发布有关XML的垃圾邮件.我一直试图让基于XML的脚本现在工作几个小时......

<content><![CDATA[Hello, world!]]></content>
Run Code Online (Sandbox Code Playgroud)

如果您搜索"SimpleXMLElement cdata",我尝试了第一次点击谷歌,但这不起作用.

Jos*_*vis 173

您可能无法正确访问它.您可以直接输出或将其转换为字符串.(在这个例子中,铸造是多余的,因为无论如何回声自动完成)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
);
echo (string) $content;

// or with parent element:

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>'
);
echo (string) $foo->content;
Run Code Online (Sandbox Code Playgroud)

你可能会有更好的运气LIBXML_NOCDATA:

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
    , null
    , LIBXML_NOCDATA
);
Run Code Online (Sandbox Code Playgroud)

  • @IMSoP添加LIBXML_NOCDATA(并且不做其他更改)有效,所以我不确定它是无关紧要的. (6认同)
  • 然后这是一个错误.升级PHP/libxml直到它工作(我从来没有遇到任何CDATA和SimpleXML问题.)你可能想试试LIBXML_NOCDATA的运气. (4认同)
  • 我知道这是一个陈旧的答案,但我想强调**这个答案的第一部分是正确的**.当您使用`print_r`打印结果时,您确实无法正确访问它.写下你真正想要的代码 - 可能是`echo`,或者是`(string)`cast,你会发现内容很好.**不要使用LIBXML_NOCDATA这是无关紧要的.** (4认同)
  • @SimonePalazzo XML由各种不同的"节点"组成 - 例如`<anElement>文本节点<aChildElement /> <![CDATA a cdata node]]>另一个文本节点</ anElement>`.CDATA和文本节点是不同的类型,SimpleXML跟踪它,因此您可以取回放入的XML.当您将SimpleXML对象压缩到数组中时,它会丢弃大量信息 - CDATA节点,注释,任何元素都没有在当前命名空间(例如`<someNSPrefix:someElement />`)中,子元素在文本中的位置等``LIBXML_NOCDATA`将CDATA节点转换为文本节点,但不修复其余节点. (3认同)
  • 不,PHP由于某种原因完全跳过CDATA.还有其他想法吗? (2认同)

Pra*_*uja 45

LIBXML_NOCDATAsimplexml_load_file()函数的可选第三个参数.这将返回XML对象,并将所有CDATA数据转换为字符串.

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);
echo "<pre>";
print_r($xml);
echo "</pre>";
Run Code Online (Sandbox Code Playgroud)


修复SimpleXML中的CDATA


bre*_*eez 13

这对我有用:

echo trim($entry->title);
Run Code Online (Sandbox Code Playgroud)


vij*_*ana 9

这对我来说非常合适.

$content = simplexml_load_string(
    $raw_xml
    , null
    , LIBXML_NOCDATA
);
Run Code Online (Sandbox Code Playgroud)