【发布时间】:2012-12-20 20:01:54
【问题描述】:
我遇到以下行为:
$xml_string1 = "<person><name><![CDATA[ Someone's Name ]]></name></person>";
$xml_string2 = "<person><name> Someone's Name </name></person>";
$person = new SimpleXMLElement($xml_string1);
print (string) $person->name; # Someone'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's Name
php 文档说 NOCDATA “将 [s] CDATA 合并为文本节点”。对我来说,这意味着 CDATA 将被视为与文本节点相同 - 或者第三个示例的行为现在将与第二个示例相同。
我无法控制 XML(它是来自外部源的提要),否则我只会删除 CDATA 标记,因为它什么都不做并破坏了我想要的行为。
为什么上面的例子会有这样的行为?有没有办法让 SimpleXML 以与处理文本节点相同的方式处理 CDATA 节点? “将 CDATA 合并为文本节点”实际上做了什么,因为我似乎不理解该选项?
我目前正在提取数据后进行解码,但上面的示例对我来说仍然没有意义。
【问题讨论】:
-
print具有字符串上下文,在这种情况下您不需要强制转换为字符串。 -
@hakre 但
print(更常写成echo)很可能在调试时用作替身,然后用其他东西代替,所以我会说这是一个好习惯始终进行字符串转换以避免以后的混淆。
标签: php xml simplexml cdata libxml2