Войти

Показать полную графическую версию : [решено] Fatal error: Uncaught exception 'DOMException'


rus-4-ever
19-03-2008, 16:14
Подскажите,
Вот такая ошибка вылезает при удалении ветки из ХМЛ...
Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in /home/www/docs/test1/change-xml.php:96 Stack trace: #0 /home/www/docs/test1/change-xml.php(96): DOMNode->removeChild(Object(DOMElement)) #1 {main} thrown in /home/www/docs/test1/change-xml.php on line 96

Код:

if ($act=='del') // delete
{
$doc->load('test.xml');

$xpath = new DOMXPath($doc);

$query = "//cat[@id='".$_POST['id']."']/descendant-or-self::*";

$entries = $xpath->query($query);

foreach ($entries as $entry) {
$arr[]=$entry->getAttribute('id');
}
foreach ($arr as $node) {
echo $node.'<br>';
}

$entry=$entries->item(0);

$child = $doc->documentElement;

$child->removeChild($entry);

$doc->save('test.xml');
}


2 дня назад код работал!!! видимо это связано с изменением файла ХМЛ...


<cat id="0">
<cat name="asd" id="29"/>
<cat name="&#x444;&#x44B;&#x432;&#x430;" id="54"/>
<cat name="&#x41A;&#x43E;&#x43C;&#x435;&#x442;&#x44B;" id="55">
<cat name="asd1" id="56">
<cat name="asd" id="57"/>
</cat>
</cat>
</cat>

С чем это связано? и как предотвратить появление этой ошибки?

bruder
20-03-2008, 01:00
привет. Я с xpath никогда не работал, однако все новое для меня интересно. Я сразу заметил что находятся нужные элементы правильно, главное удалить правильно. Покопавшись немного сотворил следующее:

//-------------Переделал твой пост на мой get так что внимательней
$act = $_GET["act"];

$doc = new DOMDocument;

// We don't want to bother with white spaces
$doc->preserveWhiteSpace = false;

// source
$doc->Load('test.xml');

if ($act=='del') // delete
{
$doc->load('test.xml');

$xpath = new DOMXPath($doc);

//-------------тут маленько исправил
$query = "//cat[@id=".$_GET['id']."]";

$entries = $xpath->query($query);

foreach ($entries as $entry) {
echo "***-";
echo $entry->getAttribute('id');
echo "+***";
if($entry->getAttribute('id')==$_GET['id'])
//----------------вот это решение
$entry->parentNode->removeChild($entry);
}
$doc->save('test2.xml');
}

ты правильно нашел ноду а удалить ее надо к предку обращаться и убить саму себя :)

rus-4-ever
20-03-2008, 01:21
Спасибо!!!
Ошибка как раз была в том что я использовал

$entry=$entries->item(0);

$child = $doc->documentElement;

$child->removeChild($entry);
А надо
$entry=$entries->item(0);

$child = $entry->parentNode;

$child->removeChild($entry);




© OSzone.net 2001-2012