PHP,SimpleXML,解码CDATA中的实体

前端之家收集整理的这篇文章主要介绍了PHP,SimpleXML,解码CDATA中的实体前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到以下行为:
$xml_string1 = "<person><name><![CDATA[ Someone&#039;s Name ]]></name></person>";
$xml_string2 = "<person><name> Someone&#039;s Name </name></person>";

$person = new SimpleXMLElement($xml_string1);
print (string) $person->name; # Someone&#039;s Name

$person = new SimpleXMLElement($xml_string2);
print (string) $person->name; # Someone's Name

$person = new SimpleXMLElement($xml_string1,LIBXML_NOCDATA);
print (string) $person->name; # Someone&#039;s Name

PHP文档说NOCDATA“将[CD] CDATA合并为文本节点”.对我来说,这意味着CDATA将被视为与文本节点相同 – 或者第三个示例的行为现在将与第二个示例相同.

我无法控制XML(它是来自外部源的提要),否则我只是删除CDATA标记,因为它什么也不做,并且破坏了我想要的行为.

为什么上面的例子表现得如此?有没有办法让SimpleXML以与处理文本节点相同的方式处理CDATA节点? “合并CDATA作为文本节点”实际上做了什么,因为我似乎不理解该选项?

在我提取数据之后,我正在解码,但上面的例子对我来说仍然没有意义.

XML中的CDATA部分的目的是“按原样”封装文本块,否则需要转义特殊字符(特别是>,<和&). CDATA部分包含字符&与包含& amp;的普通文本节点相同. 如果解析器提出忽略这一点,并且假装所有CDATA节点实际上只是文本节点,那么只要有人提到“P& O Cruises” – 它就会立即中断.根本不能单独存在(而不是& amp;或& somethingElse;). LIBXML_NOCDATA对于SimpleXML实际上是没用的,因为(字符串)$foo巧妙地将任何文本序列和CDATA节点组合成普通的PHP字符串. (人们经常没有注意到的东西,因为print_r没有注意到.)对于更系统的访问方法(例如DOM),这不一定是正确的,在这种方法中,您可以将文本节点和CDATA节点本身作为对象进行操作. 它实际上做的是浏览文档,无论它遇到CDATA部分,它都会获取内容,将其转义,并将其作为普通文本节点放回,或者将其与任何文本节点“合并”到任何一侧.表示的文本是相同的,只是以不同的方式存储在文档中;如果导出回XML,则可以看到差异,如下例所示:
$xml_string = "<person><name>Welcome aboard this <![CDATA[P&O Cruises]]> voyage!</name></person>";

$person = new SimpleXMLElement($xml_string);
echo 'CDATA retained: ',$person->asXML();
// CDATA retained: <?xml version="1.0"?>
// <person><name>Welcome aboard this <![CDATA[P&O Cruises]]> voyage!</name></person>

$person = new SimpleXMLElement($xml_string,LIBXML_NOCDATA);
echo 'CDATA merged: ',$person->asXML();
// CDATA merged: <?xml version="1.0"?>
// <person><name>Welcome aboard this P&amp;O Cruises voyage!</name></person>

如果您正在解析的XML文档包含实际包含实体的CDATA部分,则需要获取该字符串并将其完全独立于XML.执行此操作的一个常见原因(除了对库不太了解的懒惰)是将HTML中标记内容视为XML文档中的任何旧字符串,如下所示:

<Comment>
<SubmittedBy>IMSoP</SubmittedBy>
<Text><![CDATA[I'm <em>really</em> bad at keeping my answers brief <tt>;)</tt>]]></Text>
</Comment>

猜你在找的PHP相关文章