Я немного смущен относительно того, как я могу удалить родительский узел чего-то, что я могу найти через поиск 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)
поскольку это удалило бы все.
Любые идеи очень ценятся :-)
<?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>
Я бы, конечно, подошел к этой проблеме как к проблеме фильтрации, а не удаления.
Таким образом, копируя нужные узлы в другую строку или создавая другой XML-документ, если на то пошло. Вы знаете, какие инструменты вы используете для таких сценариев.
Я думаю, что это не только решит вашу проблему, но и, вероятно, облегчит чтение и понимание. Однако не уверен насчет снижения производительности. Скажите, с каким количеством узлов вы регулярно работаете.