PHP SimpleXML - Удаляет xpath узел

Я немного смущен относительно того, как я могу удалить родительский узел чего-то, что я могу найти через поиск xpath:

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

Так, это находит идентификатор объекта, никакие проблемы там - но сброс не избавляется от этого <items> узел. Все, что я хочу сделать, удаляют <items>...</items> для этого продукта. Очевидно, существуют загрузки <items> узлы в XML-файле так это наклон делают unset($xml->data->items) поскольку это удалило бы все.

Любые идеи очень ценятся :-)

12
задан Peter John 14 March 2010 в 13:37
поделиться

2 ответа

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

это работает как задумано (удаление элемента из документа), потому что Вызывается метод __ 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();

отпечатки

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

  <items>
    <info>
      <item_id>789</item_id>
    </info>
  </items>
</foo>
14
ответ дан 2 December 2019 в 05:03
поделиться

Я бы, конечно, подошел к этой проблеме как к проблеме фильтрации, а не удаления.

Таким образом, копируя нужные узлы в другую строку или создавая другой XML-документ, если на то пошло. Вы знаете, какие инструменты вы используете для таких сценариев.

Я думаю, что это не только решит вашу проблему, но и, вероятно, облегчит чтение и понимание. Однако не уверен насчет снижения производительности. Скажите, с каким количеством узлов вы регулярно работаете.

1
ответ дан 2 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: