当前位置: 首页 > 面试题库 >

PHP,SimpleXML,CDATA中的解码实体

许嘉福
2023-03-14
问题内容

我遇到以下行为:

$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“将CDATA合并为文本节点”。对我来说,这意味着CDATA将与文本节点一样对待-或第3个示例的行为现在与第2个示例相同。

我没有对XML的控制权(这是来自外部源的提要),否则我将删除CDATA标记,因为它不执行任何操作并破坏了我想要的行为。

上面的示例为什么会表现出这种方式?有什么方法可以使SimpleXML处理CDATA节点的方式与处理文本节点的方式相同?因为我似乎不了解该选项,所以“将CDATA合并为文本节点”实际上是做什么的?

在提取数据后,我目前正在解码,但是上面的示例对我来说仍然没有意义。


问题答案:

CDATA节的XML的目的是封装的文本块“为是”,否则将需要特殊字符(特别是><&)进行转义。包含字符的CDATA节与包含的&普通文本节点相同&amp;

如果解析器提出要忽略这一点,并且假装所有CDATA节点实际上只是文本节点,那么一旦有人提到“ P&O Cruises”,它就会立即中断-
&根本不能单独存在(而不是&amp;,或&somethingElse;)。

LIBXML_NOCDATA实际上是用SimpleXML漂亮没用,因为(string)$foo巧妙地结合了文本和CDATA节点的任何序列为普通PHP字符串。(人们经常注意到的东西,因为print_r没有。)对于诸如DOM之类的更系统的访问方法,这不一定是正确的,在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 SimpleXML 简介,安装,PHP 5 SimpleXML 函数,PHP 5 SimpleXML 迭代函数PHP SimpleXML 简介 SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式,只要您知道 XML 文档的布局。 SimpleXML 转换 XML 文档到 SimpleXMLElement 对象。 通过正常的属性选择器和数组迭代器,这个对象能够像其他对象一样被处理。 提示:与 DOM 或者 Expat 解析器比较,SimpleXML 只需要

  • 我有这个项目的最后期限(星期一)。它在本地主机上运行得非常好,但是当我将它上传到web服务器时,我发现我们没有启用所有DOM包,并且我无法使用函数DOM\u import\u simplexml()。我的服务器管理员忽略了我的请求,可能是因为通知太短,而且我不可能那么快地将XML系统重写为数据库系统。 这似乎是我遇到的唯一错误。拜托,如果你有什么别的想法,我很乐意听听。我不知所措,因为我找不到其他

  • 我得到xml格式的响应,数据在xml节点的cData部分内。现在当我试图提取节点值,然后用cdata文本获取值。 我如何解析它? xml: 我使用代码来获取整个列表,但我只需要获取特定的节点 上面的代码列出了所有的cdata值... 我只需要从上面的xml中获取dbid、isdb、mydb值

  • 问题内容: 我需要获取以下XML内容的HTML内容: 因此,我想获取字符串“谁,谁,我”。 如果我使用,则可以调用以获取“ 谁, 谁, 我 ”,但是如何获取内部XML没有元素本身包裹的元素的元素? 我更喜欢不涉及字符串函数的方法,但是如果那是唯一的方法,那就这样吧。 问题答案: 据我所知,没有内置的方法可以做到这一点。我建议尝试使用SimpleDOM,这是一个扩展了SimpleXMLElement

  • 本文向大家介绍PHP中的URL解码,包括了PHP中的URL解码的使用技巧和注意事项,需要的朋友参考一下 可以使用内置的“ urldecode ”功能来完成URL解码。这将返回编码数据。 urldecode函数的语法 它采用单个参数($input),它是要解码的URL。如果解码成功,则返回解码后的字符串- 示例 在上面的代码行中,“ urldecode”函数接收原始(编码字符串)并返回字符串的解码值

  • 问题内容: $value = $simpleXmlDoc->SomeNode->InnerNode; 实际上将一个simplexml对象分配给$ value而不是InnerNode的实际值。 如果我做: 我得到了价值。无论如何要获得实际值而不会显得笨拙? 问题答案: 转换为您想要的任何类型(并且有意义…)。通过串联,您隐式转换为字符串,因此