是否可以从xml文档中删除n个xml元素,以便
<root>
<example>
<thing>1</thing>
<somethingelse>1</somethingelse>
</example>
<example>
<thing>2</thing>
<somethingelse>2</somethingelse>
</example>
<example>
<thing>3</thing>
<somethingelse>3</somethingelse>
</example>
</root>
可能会成为
<root>
<example>
<thing>3</thing>
<somethingelse>3</somethingelse>
</example>
</root>
e.g。 xml_splice($ XML,2,3)
在搜索文档之后,我找不到一个简单的方法在simpleXML中执行此操作但是还有其他我可以使用的方法吗?或者我是否坚持使用$ xmlIterator-&gt; next();
编写自己的函数提前致谢
答案 0 :(得分:1)
在你的情况下,我不会使用simplexml迭代器,因为你遇到的问题是当你迭代它时删除一个元素时,迭代会在元素节点消失时中断。因此第二个元素成为第一个被移除后的第一个元素。然后迭代器转到第二个,现在已经是第三个了。
相反,你可以删除第一个元素的两倍:
$xml = simplexml_load_string($string);
for ($remove = 2; $remove--;)
{
unset($xml->example[0]);
}
那会给你:
<?xml version="1.0"?>
<root>
<example>
<thing>3</thing>
<somethingelse>3</somethingelse>
</example>
</root>
这种方法的问题在于你无法概括它。最好首先创建一个包含要删除的元素的数组,然后遍历该数组并在另一个元素之后删除一个元素。
使用simplexml创建此类数组的简单方法是iterator_to_array()
或SimpleXMLElement::xpath()
方法。当您在问题中使用 xml_splice()
作为模拟时,我会假设您希望首先看到数组变体:
$examples = $xml->example;
$elements = iterator_to_array($examples, false);
array_splice($elements, 2, 3);
这会将应删除的所有示例元素放入$elements
。剩下要做的就是删除那些。在SimpleXML中,这需要一个simplexmlelement-self-reference:
foreach($elements as $element)
{
unset($element[0]);
}
如您所见,要从$element
文档中删除$xml
节点,它的第一个偏移量( 0 )将取消设置。如果你想在它之后添加 var_dump :
unset($element[0]);
var_dump($element);
您会看到此警告,显示已删除元素节点:
警告:var_dump():节点不再存在
输出就像您现在可能预期的那样:
<?xml version="1.0"?>
<root>
<example>
<thing>3</thing>
<somethingelse>3</somethingelse>
</example>
</root>
对于带有xpath的变体,请参阅相关问题的答案: