Cal*_*vin 13
您可以使用importNode()将<identity>元素的childNodes复制到新创建的<person>元素吗?
function changeName($node, $name) {
$newnode = $node->ownerDocument->createElement($name);
foreach ($node->childNodes as $child){
$child = $node->ownerDocument->importNode($child, true);
$newnode->appendChild($child, true);
}
foreach ($node->attributes as $attrName => $attrNode) {
$newnode->setAttribute($attrName, $attrNode);
}
$newnode->ownerDocument->replaceChild($newnode, $node);
return $newnode;
}
$domElement = changeName($domElement, 'person');
Run Code Online (Sandbox Code Playgroud)
也许这样的东西可行,或者你可以尝试使用cloneChild().
编辑:实际上,我刚刚意识到原始函数会丢失节点的位置.根据thomasrutter所关联的问题,replaceChild()应该使用.
感谢您的帖子,我可以快速为我解决同样的问题.但是,我有一个DOM_NOT_FOUND异常.这可能是PHP版本问题,因为原帖是5年.
根据PHP文档(2014年2月)
DOM_NOT_FOUND
Raised if oldnode is not a child of this node.
Run Code Online (Sandbox Code Playgroud)
所以,我已经取代了
$newnode->ownerDocument->replaceChild($newnode, $node);
Run Code Online (Sandbox Code Playgroud)
同
$node->parentNode->replaceChild($newnode, $node);
Run Code Online (Sandbox Code Playgroud)
这是完整的功能(已测试):
public static function changeTagName($node, $name) {
$childnodes = array();
foreach ($node->childNodes as $child){
$childnodes[] = $child;
}
$newnode = $node->ownerDocument->createElement($name);
foreach ($childnodes as $child){
$child2 = $node->ownerDocument->importNode($child, true);
$newnode->appendChild($child2);
}
foreach ($node->attributes as $attrName => $attrNode) {
$attrName = $attrNode->nodeName;
$attrValue = $attrNode->nodeValue;
$newnode->setAttribute($attrName, $attrValue);
}
$node->parentNode->replaceChild($newnode, $node);
return $newnode;
}
Run Code Online (Sandbox Code Playgroud)
还值得一提的是,当您想要使用此函数时,您应该按照其他帖子中的说明以相反的顺序遍历DOM树.
更新:在Windows上使用和更新到PHP版本5.5.15几个月后,我遇到错误,说$ attr无法转换为字符串.所以我更新了第三个for-each循环.
| 归档时间: |
|
| 查看次数: |
9823 次 |
| 最近记录: |