【问题标题】:Parsing inline tags with SimpleXML使用 SimpleXML 解析内联标签
【发布时间】:2013-09-30 23:44:00
【问题描述】:

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

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

我知道我可以使用 $element->inlinetag 到达 inlinetag,但我不知道如何以基本上可以替换inlinetag 带有指向属性 source 的链接,而不使用它在文本中的位置。结果基本上必须是这样的:

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

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

【问题讨论】:

  • 我不确定我是否正确理解了您要执行的操作。您能否添加一个示例,修改后应该是什么样子?
  • 您是否尝试将&lt;inlinetag&gt;inline&lt;/inlinetag&gt; 替换为&lt;a href="link"&gt;inline&lt;/a&gt;,其中link 等于源属性?
  • 没错,也编辑了帖子

标签: php xml parsing xml-parsing simplexml


【解决方案1】:

这是你想要达到的结果吗?

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

【讨论】:

  • 不,我知道如何访问 inlinetag 及其属性,但我遇到的问题是知道 inlinetag 元素在随机文本中的位置。 (那么放在哪里 url.com/">inline</a>)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2014-08-06
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多