用PHP拼接XML

时间:2013-04-17 08:00:05

标签: php xml simplexml

是否可以从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();

编写自己的函数

提前致谢

1 个答案:

答案 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的变体,请参阅相关问题的答案: