为了账号安全,请及时绑定邮箱和手机立即绑定

PHP SimpleXML-删除xpath节点

/ 猿问

PHP SimpleXML-删除xpath节点

PHP
素胚勾勒不出你 2019-12-06 10:23:00

我对如何删除可以通过xpath搜索找到的东西的父节点有些困惑:


$xml = simplexml_load_file($filename);

$data = $xml->xpath('//items/info[item_id="' . $item_id . '"]');

$parent = $data[0]->xpath("parent::*");

unset($parent);

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


任何想法表示赞赏:-)


查看完整描述

3 回答

?
当年话下

<?php

$xml = new SimpleXMLElement('<a><b/></a>');

unset($xml->b);

echo $xml->asxml();

由于调用了__unset()方法(或模块代码中的等效方法),因此可以按预期工作(从文档中删除<b />元素)。

但是,当您调用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();

版画


<?xml version="1.0"?>

<foo>

  <items>

    <info>

      <item_id>123</item_id>

    </info>

  </items>


  <items>

    <info>

      <item_id>789</item_id>

    </info>

  </items>

</foo>


查看完整回答
反对 2019-12-06
?
饮歌长啸

对我来说,它像这样工作。不unset($parent);但是unset($parent[0]);:


$res    = $xml->xpath('//key/k[. = "string"]/parent::*');

$parent = $res[0];

unset($parent[0]);

这是通过在(或)中创建对simplexml-element的自引用来实现的。$parent$res[0]


查看完整回答
反对 2019-12-06
?
MMTTMM

一种方法是将SimpleXML节点导入DOMDocument,然后在DOMDocument中删除。并不是很简单,但是它可以工作:


$xml = simplexml_load_file($filename);


$result = $xml->xpath("/cardsets/cardgroup");


foreach ($result as $el)

{

    if ($el['id'] == $id)

    {

        $domRef = dom_import_simplexml($el);

        $domRef->parentNode->removeChild($domRef);

        $dom = new DOMDocument('1.0');

        $dom->preserveWhiteSpace = false;

        $dom->formatOutput = true;

        $dom->loadXML($xml->asXML());

        $dom->save($filename);

        break;

    }

}


查看完整回答
反对 2019-12-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信