2

我正在编写一个 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>

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

4

2 回答 2

5

"并且'只有在属性值内时才是 XML 中的特殊字符。"在元素的文本内容中, or的含义没有歧义',因为要查找的下一个特殊标记是<开始一个开始或结束标记。

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

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

于 2013-08-20T19:44:18.580 回答
1

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

这是底层libxml库中的“功能”或错误:默认情况下,所有实体(除了lt gt&)都未转义。

具有讽刺意味的是,您可以显式启用取消转义 (LIBXML_NOENT),但不能禁用它。

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

于 2014-05-24T08:55:56.360 回答