PHP SimpleXMLElement不会将实体引用

时间:2013-08-20 18:05:47

标签: php xml simplexml xml-entities

我正在编写一个PHP脚本来生成一些xml文档,我在使用SimpleXML和引号时遇到了一些问题。

如果我有这样的代码:

$xml = new SimpleXMLElement('<myxml />');
$xml->addChild('title','My Feed');
$xml->addChild('description','Entity data here - &amp; &quot; &apos;');

如果我print_r $ xml obj那么我得到了这个:

print_r($xml);
SimpleXMLElement Object
(
  [title] => My Feed
  [description] => Entity data here - & " '
)

这似乎只有在对象中它才会使实体重新回到各自的角色中。但是,当我在对象上调用asXML()来获取XML时,它会向我显示:

echo $xml->asXML();
<?xml version="1.0"?>
  <myxml>
  <title>My Feed</title>
  <description>Entity data here - &amp; " '</description>
</myxml>

它使&amp;回到一个实体,但似乎将引号保留为字符。它不应该将它们全部转换为实体吗?

2 个答案:

答案 0 :(得分:4)

"'只是XML中的特殊字符,如果它们位于属性值中。在元素的文本内容中,"'的含义没有歧义,因为要查找的下一个特殊标记是<来启动开始或结束标记

因此虽然<foo bar="hello "world"" />是无效的XML,但<foo>hello "world"</foo>不是,因此不需要转义

(仅仅因为它不是必需,并不意味着它不是可能,所以对于为什么SimpleXML至少不保留,可能会有更全面的答案你自愿放在那里的实体。)

答案 1 :(得分:0)

似乎问题有点深: https://bugs.php.net/bug.php?id=49437

它是一个&#34;功能&#34;或基础 libxml 库中的错误:默认情况下所有实体( lt gt &amp; )正未被转播。

具有讽刺意味的是,您可以明确启用unescaping(LIBXML_NOENT),但不能禁用它。

我找到了处理它的唯一方法:使用 CData 节点,其中数据保持原样不变。但当然,这不是一个理想的解决方案。