我正在编写一个PHP脚本来生成一些xml文档,我在使用SimpleXML和引号时遇到了一些问题。
如果我有这样的代码:
$xml = new SimpleXMLElement('<myxml />');
$xml->addChild('title','My Feed');
$xml->addChild('description','Entity data here - & " '');
如果我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 - & " '</description>
</myxml>
它使&amp;回到一个实体,但似乎将引号保留为字符。它不应该将它们全部转换为实体吗?
答案 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 节点,其中数据保持原样不变。但当然,这不是一个理想的解决方案。