PHP SimpleXML - 删除xpath节点

Pet*_*ohn 12 php simplexml

我有点困惑,我怎么能删除我可以通过xpath搜索找到的东西的父节点:

$xml = simplexml_load_file($filename);
$data = $xml->xpath('//items/info[item_id="' . $item_id . '"]');
$parent = $data[0]->xpath("parent::*");
unset($parent);
Run Code Online (Sandbox Code Playgroud)

所以,它找到了项目ID,没有问题 - 但是没有设置不能摆脱这个<items>节点.我想要做的就是删除<items>...</items>此产品.显然,<items>xml文件中存在大量节点,因此无法unset($xml->data->items)删除所有节点.

任何想法非常赞赏:-)

Vol*_*erK 14

<?php
$xml = new SimpleXMLElement('<a><b/></a>');
unset($xml->b);
echo $xml->asxml();
Run Code Online (Sandbox Code Playgroud)

这是按预期工作的(从文档中删除<b />元素),因为调用__unset()方法(或模块代码中的等价物).
但是当你调用unset($parent);它时只删除存储在$ parent中的对象引用,但它不会影响对象本身或存储在$ xml中的文档.我会为此恢复DOMDocument.

<?php
$doc = new DOMDOcument;
$doc->loadxml('<foo>
  <items>
    <info>
      <item_id>123</item_id>
    </info>
  </items>
  <items>
    <info>
      <item_id>456</item_id>
    </info>
  </items>
  <items>
    <info>
      <item_id>789</item_id>
    </info>
  </items>
</foo>');
$item_id = 456;

$xpath = new DOMXpath($doc);
foreach($xpath->query('//items[info/item_id="' . $item_id . '"]') as $node) {
  $node->parentNode->removeChild($node);
}
echo $doc->savexml();
Run Code Online (Sandbox Code Playgroud)

版画

<?xml version="1.0"?>
<foo>
  <items>
    <info>
      <item_id>123</item_id>
    </info>
  </items>

  <items>
    <info>
      <item_id>789</item_id>
    </info>
  </items>
</foo>
Run Code Online (Sandbox Code Playgroud)


Max*_*Max 13

它对我来说就像这样.不是unset($parent);但是unset($parent[0]);:

$res    = $xml->xpath('//key/k[. = "string"]/parent::*');
$parent = $res[0];
unset($parent[0]);
Run Code Online (Sandbox Code Playgroud)

这通过在(或)中创建对simplexml元素自引用来工作.$parent$res[0]

有关更详细的说明,请参阅相关问题中的相关答案.在SimpleXML for PHP中删除具有特定属性的子项.


pes*_*taa 1

我肯定会把这个问题作为过滤问题来处理,而不是删除问题。

因此,将所需的节点复制到另一个字符串中或为此构建另一个 XML 文档。您知道在这种情况下使用什么工具。

我认为这不仅解决了您的问题,而且可能使您更容易阅读和理解。但不确定性能是否会受到影响。告诉我们您经常使用多少个节点。