PHP DOMElement nodeValue 不保留转义(编码)字符

问题描述 投票:0回答:1

我得到了一个不寻常的目标,那就是从具有以下约束的多维数组创建一个不带 CDATA 元素的 XML:

  1. 不应使用CDATA
  2. <, >、'、"、& - 这些字符应该进行编码。

但是当我在将 ' 和 " 转换为

&apos;
&quot;
后设置 nodeValue 时,该值不会保留在 XML 节点中并且不会被转义。

 private function convertElement(DOMElement $element, $value)
    {...
   $value = htmlspecialchars($value ?? '', ENT_XML1 | ENT_QUOTES); 
   $element->nodeValue = $value;

Node 元素不保留编码的 char 值,并且 &apos 和 "es 被解码为 ' 和 "

dd($element->nodeValue);
// &lt;p itemprop='description'&gt;&#039;Test single quotes'&lt;/p&gt;itemprop="description">
// Should have retained
// &lt;p itemprop=&quot;description&quot;&gt;&#039;Test single quotes&#039;&lt;/p&gt;

如果我使用appendChild(),它会导致值双重转义。

//value = Test Ampersand &
 $textNode = $this->document->createTextNode($value);  
 $element->appendChild($textNode); 

//Test Amersand &amp;amp;

我的问题似乎与这种现象有关DOMElement nodeValue inconsistant get vs set 我将不胜感激任何解决方法或建议。 谢谢!

php xml dom cdata
1个回答
0
投票

请尝试这个

function convertElement(DOMElement $element, $value) {
    $encodedValue = htmlspecialchars($value ?? '', ENT_XML1 | ENT_QUOTES);
    $textNode = $element->ownerDocument->createTextNode($encodedValue);
    while ($element->hasChildNodes()) {
        $element->removeChild($element->firstChild);
    }
    $element->appendChild($textNode);
    echo $element->ownerDocument->saveXML($element);
}
$doc = new DOMDocument();
$doc->loadXML('<root><element><![CDATA[<p itemprop="description">\'Test single quotes\'</p>]]></element></root>');

$element = $doc->getElementsByTagName('element')->item(0);
$cdataContent = $element->nodeValue;
convertElement($element, $cdataContent);
echo $doc->saveXML();
© www.soinside.com 2019 - 2024. All rights reserved.