我正在使用SimpleXML& PHP以下列形式解析XML元素:
<element>
random text with <inlinetag src="http://url.com/">inline</inlinetag> XML to parse
</element>
我知道我可以使用 $ element-&gt; inlinetag 访问 inlinetag ,但我不知道如何以这样的方式联系到它基本上将 inlinetag 替换为属性 source 的链接,而不使用它在文本中的位置。结果基本上必须如下所示:
here is a random text with <a href="http://url.com/">inline</a> XML
这可能是一个愚蠢的问题,希望有人在这里可以提供帮助! :)
答案 0 :(得分:1)
我找到了一种使用DOMElement的方法。
替换元素的一种方法是使用不同的名称/属性克隆它。这是一种方法,使用How do you rename a tag in SimpleXML through a DOM object?
上给出的接受答案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>
就是这样!剩下要做的就是获取元素标记的内容。
答案 1 :(得分:0)
这是您想要达到的结果吗?
<?php
$data = '<element>
random text with
<inlinetag src="http://url.com/">inline
</inlinetag> XML to parse
</element>';
$xml = simplexml_load_string($data);
foreach($xml->inlinetag as $resource)
{
echo 'Your SRC attribute = '. $resource->attributes()->src; // e.g. name, price, symbol
}
?>