php 封装xml cdata,PHP,SimpleXML,CDATA中的解码实体

博客内容探讨了XML解析中CDATA节的作用,指出当解析器遇到包含特殊字符的CDATA时可能会导致问题。LIBXML_NOCDATA选项会导致CDATA内容被转义并与文本节点合并。文章通过示例展示了SimpleXML和DOM解析器在处理CDATA时的不同行为,并提到了在处理包含实体的CDATA时需要进行额外的转义操作。此外,还讨论了在HTML内容被视为XML字符串时可能遇到的挑战。
摘要由CSDN通过智能技术生成

小编典典

CDATA节的XML的目的是封装的文本块“为是”,否则将需要特殊字符(特别是>,

如果解析器提出要忽略这一点,并且假装所有CDATA节点实际上只是文本节点,那么一旦有人提到“ P&O Cruises”,它就会立即中断-

&根本不能单独存在(而不是&,或&somethingElse;)。

该LIBXML_NOCDATA实际上是用SimpleXML漂亮没用,因为(string)$foo巧妙地结合了文本和CDATA节点的任何序列为普通PHP字符串。(人们经常注意到的东西,因为print_r没有。)对于诸如DOM之类的更系统的访问方法,这不一定是正确的,在DOM中,您可以独立地将文本节点和CDATA节点作为对象来操作。

它有效地做的是遍历文档,无论遇到CDATA节,它都会取走内容,对其进行转义,然后将其放回普通文本节点,或者将其与任何文本节点“合并”到任一侧。表示的文本是相同的,只是以不同的方式存储在文档中。您可以看到导出到XML的区别,如以下示例所示:

$xml_string = "Welcome aboard this voyage!";

$person = new SimpleXMLElement($xml_string);

echo 'CDATA retained: ', $person->asXML();

// CDATA retained: <?xml version="1.0"?>

// Welcome aboard this voyage!

$person = new SimpleXMLElement($xml_string, LIBXML_NOCDATA);

echo 'CDATA merged: ', $person->asXML();

// CDATA merged: <?xml version="1.0"?>

// Welcome aboard this P&O Cruises voyage!

如果您要解析的XML文档包含实际上包含实体的CDATA部分,则需要采用该字符串并将其完全独立于XML取消转义。这样做的一个常见原因(除了对图书馆了解得不那么懒惰之外)是将HTML中标记的内容视为XML文档中的任何旧字符串,例如:

IMSoP

really bad at keeping my answers brief ;)]]>

2020-05-29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值