使用 SimpleXML 删除 XML 文档元素

问题描述 投票:0回答:2

我有以下代码:

<nutrition>
    <code>
        <lol1>energy</lol1>
        <lol2>protein</lol2>
        <lol3>fat</lol3>
    </code>
</nutrition>

我想要:

<code>
    <lol1>energy</lol1>
    <lol2>protein</lol2>
    <lol3>fat</lol3>
</code>

是否有任何 SimpleXML 函数可以删除文档元素?

php simplexml
2个回答
1
投票

我知道有一些 DOM 库,但我不想使用它

在 PHP SimpleXML 中重命名文档元素在技术上是不可能的。

实际上你也不能用 DOMDocument 重命名它。但与 SimpleXML 不同的是,您可以轻松地使用 DOMDocument::replaceChild 替换元素。

使用给定的输入:

$buffer = <<<XML
<nutrition>
    <code>
        <lol1>energy</lol1>
        <lol2>protein</lol2>
        <lol3>fat</lol3>
    </code>
</nutrition>
XML;

首先创建DOMDocument

$doc                     = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->formatOutput       = true;

然后在此处加载您的 XML(例如作为字符串

$buffer
):

$doc->loadXML($buffer);

获取即将成为文档元素:

$code = $doc->documentElement->getElementsByTagName('*')->item(0);

替换文档元素和输出以显示其有效:

$doc->replaceChild($code, $doc->documentElement);
$doc->save('php://output');

这给出了以下输出:

<?xml version="1.0"?>
<code>
  <lol1>energy</lol1>
  <lol2>protein</lol2>
  <lol3>fat</lol3>
</code>

就是这样。即使您似乎不喜欢 DOMDocument,希望这仍然有帮助。但不要害怕,它是 SimpleXMLElement 的姐妹库。


0
投票

是的,您可以:

$xmlstr = <<<'XML'
<nutrition>
    <code>
        <lol1>energy</lol1>
        <lol2>protein</lol2>
        <lol3>fat</lol3>
    </code>
</nutrition>
XML;

$xml = new SimpleXMLElement($xmlstr);
foreach ($xml->xpath('/nutrition/child::code[1]') as $node) {
    $unwrappedXml = new \SimpleXMLElement($node->asXML());
    break;
}

echo $unwrappedXml->asXML();
© www.soinside.com 2019 - 2024. All rights reserved.