我得到了一个不寻常的目标,那就是从具有以下约束的多维数组创建一个不带 CDATA 元素的 XML:
但是当我在将 ' 和 " 转换为
'
和 "
后设置 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);
// <p itemprop='description'>'Test single quotes'</p>itemprop="description">
// Should have retained
// <p itemprop="description">'Test single quotes'</p>
如果我使用appendChild(),它会导致值双重转义。
//value = Test Ampersand &
$textNode = $this->document->createTextNode($value);
$element->appendChild($textNode);
//Test Amersand &amp;
我的问题似乎与这种现象有关DOMElement nodeValue inconsistant get vs set 我将不胜感激任何解决方法或建议。 谢谢!
请尝试这个
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();