用PHP删除结束标记XML根


Remove closing tag XML root with PHP

我想删除XML文件的结束标记。
目前,我正在使用simplexml加载文件。
我看过removeChild,但没有找到一个很好的例子,有人用它来删除根的结束标签。

我现在有:

<root>
    <tag>
        <info1>Some info</info1>
        <info2>Some info</info2>
    </tag>
</root>

将成为:

<root>
    <tag>
        <info1>Some info</info1>
        <info2>Some info</info2>
    </tag>

我想做这件事没有太多的困难,有人知道怎么做吗?

编辑:我已经解决了这个问题,如评论中所述。使用simpleXML不是必需的,因为我应该在我的问题中说明。

实际上,像SimpleXML这样的XML解析器无法创建无效的XML,因此这不是一个选项。

然而,它显然是最后一行。因此,您可以搜索最后的第二个分隔符,并将其删除。这应该很容易做到。当您编写SimpleXML时,当您将XML作为字符串返回时,行分隔符是"'xA"(对于US-ASCII/ISO-8859-1/UTF-8编码的XML文件,通常是这种情况):

$xml  = $simpleXml->asXML();
$last = strrpos($xml, "'xA", -2);
if ($last === false) {
    throw new UnexpectedValueException('Can not find beginning of last line.');
}
echo substr($xml, 0, $last), "'n";

演示

这并不是真的写得很好,但是可能只是适合你的情况。

显然您想要添加数据到您现有的simplexml-object?其他保持数据有效的方法:

    使用simplexml的add-methods。
  1. 使用循环从simplexml中读取并使用xmlwriter写入新文件,在发送命令关闭根元素之前添加新的xml数据。

我通过更改读取文件的方法来解决这个问题,并将其作为文本而不是simpleXML对象获取。之后,我只是用str_replace删除标记并添加新内容。(我知道不完美,但工作如预期)