Как удалить дочерний узел с элементом (индексом)?

Я пишу скрипт, который ищет в нескольких XML-файлах какой-либо тег, а затем, если он найдет в этом теге дочерний элемент с именем update, мне нужно удалить этот дочерний элемент, а затем добавить его снова.

Проблема в том, что я не понимаю, почему он не удаляет узлы, которые я хочу удалить.

Итак, мой сценарий (важная часть, которую я хочу обсудить) выглядит так:

/*
// Pushing all offers from all files to $allOffers array
*/
foreach ($offerFiles as $file)
{
$file = $path . "\\" . $file;
$currentXML = new SimpleXMLElement($file, 0, true);
foreach($currentXML->offer as $offer)
{
if ($offer->number) {
if (!check_if_exists($compiledXML, $offer->number))
{
//array_push($allOffers, $offer);
}
if (check_if_exists($compiledXML, $offer->number) && $offer->action == "update")
{
update_existing_entry($compiledFile, $compiledXML, $offer);

// var_dump($allOffers);

}
}
}

}

/*
// Find and delete existing XML entry offer with update action
*/

function update_existing_entry ($compiledFile, $compiledXML, $parsedOffer) {


$index = 0;
$doc = new DOMDocument();
$doc->load($compiledFile);
$elem = $doc->documentElement;


foreach ($compiledXML->offer as $offer) {
if ((string)$parsedOffer->number === (string)$offer->number) {

$firstchild =  $doc->getElementsByTagName('offer')->item($index);

// $firstchild->nodeValue = null;
$elem->removeChild($firstchild);
$doc->save($compiledFile);

//var_dump($parsedOffer->asXML());
}
$index++;

}
var_dump($deleteNodes);
}

Теперь, если у меня есть 2 XML-файла, один с действием обновления, другой без него, он работает отлично. Проблемы начинаются, когда 1 и 2 файла имеют действие обновления, тогда я всегда заканчиваю только одним удаленным узлом и ошибкой:

Фатальная ошибка: Uncaught TypeError: Аргумент 1 передан
DOMNode :: removeChild () должен быть экземпляром DOMNode, с нулевым значением

Почему я не могу удалить узлы с выбранным индексом?

0

Решение

Я не знаю, лучший ли это подход, но я исправил это так:

   function update_existing_entry ($compiledFile, $compiledXML, $parsedOffer) {


$doc = new DOMDocument();
$doc->load($compiledFile);
$node = $doc->documentElement;

foreach ($doc->getElementsByTagName('offer') as $child) {
if (strpos($child->nodeValue, (string)$parsedOffer->number) !== false) {
$node->removeChild($child);
}

}
$doc->save($compiledFile);

}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]