如何仅更改 DOM 节点的根标签名称?
在 DOM-Document 模型中,我们不能改变对象的属性documentElement
,DOMElement
所以,我们需要“重建”节点……但是如何用childNodes
属性“重建”呢?
注意:我可以通过使用 saveXML 转换为字符串并通过正则表达式切割根来做到这一点......但这是一种解决方法,而不是 DOM 解决方案。
试过但不起作用,PHP 示例
PHP 示例(不起作用,但为什么?):
试一试
// DOMElement::documentElement can not be changed, so...
function DomElement_renameRoot1($ele,$ROOTAG='newRoot') {
if (gettype($ele)=='object' && $ele->nodeType==XML_ELEMENT_NODE) {
$doc = new DOMDocument();
$eaux = $doc->createElement($ROOTAG); // DOMElement
foreach ($ele->childNodes as $node)
if ($node->nodeType == 1) // DOMElement
$eaux->appendChild($node); // error!
elseif ($node->nodeType == 3) // DOMText
$eaux->appendChild($node); // error!
return $eaux;
} else
die("ERROR: invalid DOM object as input");
}
appendChild($node)
产生错误的原因:
Fatal error: Uncaught exception 'DOMException'
with message 'Wrong Document Error'
尝试2
来自@can 建议(仅指向链接)和我对糟糕的dom-domdocument-renamenode 手册的解释。
function DomElement_renameRoot2($ele,$ROOTAG='newRoot') {
$ele->ownerDocument->renameNode($ele,null,"h1");
return $ele;
}
renameNode() 方法导致错误,
Warning: DOMDocument::renameNode(): Not yet implemented
试一试 3
来自PHP 手册,评论 1。
function renameNode(DOMElement $node, $newName)
{
$newNode = $node->ownerDocument->createElement($newName);
foreach ($node->attributes as $attribute)
$newNode->setAttribute($attribute->nodeName, $attribute->nodeValue);
while ($node->firstChild)
$newNode->appendChild($node->firstChild); // changes firstChild to next!?
$node->ownerDocument->replaceChild($newNode, $node); // changes $node?
// not need return $newNode;
}
replaceChild() 方法导致错误,
Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error'