gpt4 book ai didi

php - 如何通过 DOM 对象重命名 SimpleXML 中的标签?

转载 作者:可可西里 更新时间:2023-11-01 00:10:53 28 4
gpt4 key购买 nike

问题看起来很简单,但我无法访问 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());

它将用具有新名称的克隆替换旧节点。

但请注意,这是原始节点内容的副本。如果您有任何指向旧节点的变量,它们现在是无效的。

关于php - 如何通过 DOM 对象重命名 SimpleXML 中的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6694956/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com