问题看起来很简单,但我无法访问 SimpleXMLElement 的标签名称。
假设我有以下 XML 结构:
<xml>
<oldName>Stuff</oldName>
</xml>
我希望它看起来像这样:
<xml>
<newName>Stuff</newName>
</xml>
这是否可以在不复制整个对象的情况下完成?
我开始意识到我处理这个问题的方法是错误的。看来我需要将 SimpleXMLElement 转换为 DOM 对象。这样做后,我发现很难按照我想要的方式操作对象(显然,在 DOM 中重命名标签并不容易,这是有原因的)。
所以...我可以通过导入将 SimpleXMLElement 导入到 DOM 对象中,但我发现很难进行克隆。
以下是克隆 DOM 对象背后的正确想法还是我还差得远:
$old = $dom->getElementsByTagName('old')->item(0); // The tag is unique in my case
$new = $dom->createElement('new');
/* ... some recursive logic to copy attributes and children of the $old node ... */
$old->ownerDocument->appendChild($new);
$new->ownerDocument->removeChild($old);
以下可能是不使用 XSLT 复制节点子节点和属性的最简单方法:
function clonishNode(DOMNode $oldNode, $newName, $newNS = null)
{
if (isset($newNS))
{
$newNode = $oldNode->ownerDocument->createElementNS($newNS, $newName);
}
else
{
$newNode = $oldNode->ownerDocument->createElement($newName);
}
foreach ($oldNode->attributes as $attr)
{
$newNode->appendChild($attr->cloneNode());
}
foreach ($oldNode->childNodes as $child)
{
$newNode->appendChild($child->cloneNode(true));
}
$oldNode->parentNode->replaceChild($newNode, $oldNode);
}
您可以这样使用:
$dom = new DOMDocument;
$dom->loadXML('<foo><bar x="1" y="2">x<baz/>y<quux/>z</bar></foo>');
$oldNode = $dom->getElementsByTagName('bar')->item(0);
clonishNode($oldNode, 'BXR');
// Same but with a new namespace
//clonishNode($oldNode, 'newns:BXR', 'http://newns');
die($dom->saveXML());
它将用具有新名称的克隆替换旧节点。
但请注意,这是一个copy原始节点的内容。如果您有任何指向旧节点的变量,它们现在无效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)