用PHP删除结束标记XML根

问题描述:

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

我目前有:

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

将成为:

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

我想这样做没有太大困难,有人知道怎么样?

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

+2

这不会导致XML损坏吗? – 2013-03-06 10:16:12

+0

它会,但我稍后将它重新添加回到文件中。 – Parrotmaster 2013-03-06 10:17:48

+0

如果您确定它始终以该文件最后一行中的该标记结尾,则可以将文件的最后一行剥离。 – Tyil 2013-03-06 10:29:25

我解决了它通过改变读取文件的方法,并获取它作为文本,而不是simpleXML对象。之后,我只需使用str_replace删除标签并添加新内容即可。 (不完美我知道,但按预期工作)

实际上,像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"; 

Demo

这是没有什么严格写得很好,但可能只适合你的情况。

显然你想添加数据到你现有的simplexml对象?保持数据有效的其他方法:

  1. 使用simplexml的add-methods。

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