我找到了一种使用 DOMElement 的方法。
替换元素的一种方法是使用不同的名称/属性克隆它。这是一种方法,使用如何通过 DOM 对象重命名 SimpleXML 中的标签?
function clonishNode(DOMNode $oldNode, $newName, $replaceAttrs = [])
{
$newNode = $oldNode->ownerDocument->createElement($newName);
foreach ($oldNode->attributes as $attr)
{
if (isset($replaceAttrs[$attr->name]))
$newNode->setAttribute($replaceAttrs[$attr->name], $attr->value);
else
$newNode->appendChild($attr->cloneNode());
}
foreach ($oldNode->childNodes as $child)
$newNode->appendChild($child->cloneNode(true));
$oldNode->parentNode->replaceChild($newNode, $oldNode);
}
现在,我们使用这个函数来克隆具有新元素和属性名称的内联元素。棘手的部分来了:遍历所有节点不会按预期工作。所选节点的长度将在您克隆它们时发生变化,因为原始节点已被删除。因此,我们只选择第一个元素,直到没有元素可以克隆。
$xml = '<element>
random text with <inlinetag src="http://url.com/">inline</inlinetag> XML to parse
</element>';
$dom = new DOMDocument;
$dom->loadXML($xml);
$nodes= $dom->getElementsByTagName('inlinetag');
echo $dom->saveXML(); //<element>random text with <inlinetag src="http://url.com/">inline</inlinetag> XML to parse</element>
while($nodes->length > 0) {
clonishNode($nodes->item(0), 'a', ['src' => 'href']);
}
echo $dom->saveXML(); //<element>random text with <a href="http://url.com/">inline</a> XML to parse</element>
就是这样!剩下要做的就是获取元素标签的内容。