使用SimpleXML解析内联标记

时间:2013-09-25 11:42:53

标签: php xml parsing xml-parsing simplexml

我正在使用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

这可能是一个愚蠢的问题,希望有人在这里可以提供帮助! :)

2 个答案:

答案 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
}
?>