1

我正在使用 SimpleXML & PHP 以以下形式解析 XML 元素:

<element>
random text with <inlinetag src="http://url.com/">inline</inlinetag> XML to parse
</element>

我知道我可以使用$element->inlinetag到达inlinetag,但我不知道如何以这样一种方式到达它,即我基本上可以用指向属性源的链接替换​​inlinetag而不使用它在文本中的位置。结果基本上必须如下所示:

here is a random text with <a href="http://url.com/">inline</a> XML

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

4

2 回答 2

1

我找到了一种使用 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>

就是这样!剩下要做的就是获取元素标签的内容。

于 2013-09-25T14:49:45.333 回答
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
}
?>
于 2013-09-25T12:01:45.747 回答