繁体   English   中英

PHP如何使用 具有DOMdocument的XML中的实体

[英]PHP How to use quot; entities in XML with DOMdocument

我正在修改其他库生成的XML文件的内容。 我正在使用PHP(5.3.10)进行一些DOM修改,然后重新插入替换节点。

我正在使用的XML数据具有&quot 元素,然后再进行操作,完成修改后,我希望按照http://www.w3.org/TR/REC-xml/保留这些元素。

但是,PHP在更改" 元素。 看我的例子。

$temp = 'Hello "XML".';
$doc = new DOMDocument('1.0', 'utf-8');
$newelement = $doc->createElement('description', $temp);
$doc->appendChild($newelement);
echo $doc->saveXML() . PHP_EOL; // shows " instead of element
$node = $doc->getElementsByTagName('description')->item(0);
echo $node->nodeValue . PHP_EOL; // also shows "

输出量

<?xml version="1.0" encoding="utf-8"?> 
<description>Hello "XML".</description>

Hello "XML".

这是PHP错误还是我做错了什么? 我希望没有必要在每个字符位置都使用createEntityReference。

相似的问题: PHP XML实体编码问题


编辑:作为示例,显示saveXML不应转换&quot; &amp; 行为正常。 该$ temp字符串应真正输出,因为它是在saveXML()期间最初与实体​​一起输入的。

$temp = 'Hello &quot;XML&quot; &amp;.';
$doc = new DOMDocument('1.0', 'utf-8');
$newelement = $doc->createElement('description', $temp);
$doc->appendChild($newelement);
echo $doc->saveXML() . PHP_EOL; // shows " instead of element like &amp;
$node = $doc->getElementsByTagName('description')->item(0);
echo $node->nodeValue . PHP_EOL; // also shows " &

输出量

<?xml version="1.0" encoding="utf-8"?>
<description>Hello "XML" &amp;.</description>

Hello "XML" &.

答案是,根据规范它实际上不需要任何转义(跳过对CDATA的提及):

与符号(&)和左尖括号(<) 不能以原义形式出现(...)如果在其他地方需要,则必须使用数字字符引用或字符串" &amp; "" &lt; " 可以使用字符串" &gt; " (...)表示直角括号(>)。

为了允许属性值包含单引号和双引号,可以将单引号或单引号字符(')表示为" &apos; " ,将双引号字符(“)表示为" &quot; " " &quot; "

您可以使用createTextNode()来执行正确的转义,从而轻松验证这一点:

$dom = new DOMDocument;
$e = $dom->createElement('description');
$content = 'single quote: \', double quote: ", opening tag: <, ampersand: &, closing tag: >';
$t = $dom->createTextNode($content);
$e->appendChild($t);
$dom->appendChild($e);

echo $dom->saveXML();

输出:

<?xml version="1.0"?>
<description>single quote: ', double quote: ", opening tag: &lt;, ampersand: &amp;, closing tag: &gt;</description>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM