Как удалить дочерний узел с элементом (индексом)? - PullRequest
0 голосов
/ 27 сентября 2018

Я пишу скрипт, который ищет в нескольких 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 с действием обновления, другой без него, он работаетидеально.Проблемы начинаются, когда файлы 1 и 2 имеют действие обновления, затем я всегда заканчиваю только одним удаленным узлом и ошибкой:

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

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

1 Ответ

0 голосов
/ 27 сентября 2018

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

   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);

}
...