gpt4 book ai didi

PHP如何使用";带有 DOMdocument 的 XML 实体

转载 作者:可可西里 更新时间:2023-10-31 23:40:01 25 4
gpt4 key购买 nike

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

我正在处理的 XML 数据有 ";在我进行操作之前的元素,我想按照 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 Entity Encoding issue


编辑:作为显示 saveXML 的示例,不应像行为正常的 & 那样转换 " 实体。这个 $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" &.

最佳答案

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

The ampersand character (&) and the left angle bracket (<) must not appear in their literal form (...) If they are needed elsewhere, they must be escaped using either numeric character references or the strings " &amp; " and " &lt; " respectively. The right angle bracket (>) may be represented using the string " &gt; " (...)

To allow attribute values to contain both single and double quotes, the apostrophe or single-quote character (') may be represented as " &apos; ", and the double-quote character (") as " &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>

关于PHP如何使用";带有 DOMdocument 的 XML 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28399653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com