Connecting Tech Pros Worldwide Help | Site Map

XML/DOM deleting childnodes/hierarchy

  #1  
Old October 18th, 2006, 07:15 AM
tsuki@gmx.li
Guest
 
Posts: n/a
Hello,

I have a problem concerning DOM and XML.

The structure of my xml is the following:
<?xml version="1.0" encoding="utf-8"?>
<website>
<language1>
<seite>
<bereich1>
<text></text>
<link>
<link></link>
</link>
<link>
<link></link>
</link>
<link>
</link>
</bereich1>
<bereich2>
</bereich2>
</seite>
</language1>
</website>

if I change and save the contents of the link-tags, there is no
problem.
(to change the value of a link, I simply select them by getElementsByID
and loop them in a for-loop).

But if I have to delete one of them, it seems that the hierarchy
somehow causes trouble, a "not found error" occurs.
If there is only a list of links, which doesn't contain other links,
the deleting works.

My question: why does the principle of the for-looping work with
changing the values of the link, but doesnt work when i want to delete
them?

The code for deleting:

$DeleteIt=(int)$DeleteIt;
if($Sprache=="Deutsch") $parent =
$dom->getElementsByTagName('language1')->item(0);
else if ($Sprache=="Englisch") $parent =
$dom->getElementsByTagName('language2')->item(0);
$parent2=$parent->getElementsByTagName('seite')->item($Seite);
$parent3=$parent2->getElementsByTagName('bereich1')->item(0);
$toDelete=$parent3->getElementsByTagName('link')->item($DeleteIt);
$okay = $parent3->removeChild($toDelete);

if I replace the last two lines by:

$toDelete=$parent3->getElementsByTagName('link')->item($DeleteIt)->nodeValue;
echo $toDelete;

the value of the link that has to be deleted is given - this works.


Can anyone help me solving the problem or explaining why the one works
and the other doesn't?

  #2  
Old October 18th, 2006, 08:15 AM
p.lepin@ctncorp.com
Guest
 
Posts: n/a

re: XML/DOM deleting childnodes/hierarchy



tsuki@gmx.li wrote:
Quote:
<?xml version="1.0" encoding="utf-8"?>
<website>
<language1>
<seite>
<bereich1>
<text></text>
<link>
<link></link>
</link>
<link>
<link></link>
</link>
<link>
</link>
</bereich1>
<bereich2>
</bereich2>
</seite>
</language1>
</website>
[...]
Quote:
But if I have to delete one of them, it seems that the
hierarchy somehow causes trouble, a "not found error"
occurs. If there is only a list of links, which doesn't
contain other links, the deleting works.
[...]
Quote:
$DeleteIt=(int)$DeleteIt;
if($Sprache=="Deutsch") $parent =
$dom->getElementsByTagName('language1')->item(0);
else if ($Sprache=="Englisch") $parent =
$dom->getElementsByTagName('language2')->item(0);
$parent2=$parent->getElementsByTagName('seite')->item
($Seite);
$parent3=$parent2->getElementsByTagName('bereich1')->
item(0);
$toDelete=$parent3->getElementsByTagName('link')->
item($DeleteIt);
$okay = $parent3->removeChild($toDelete);
>
if I replace the last two lines by:
>
$toDelete=$parent3->getElementsByTagName('link')->item(
$DeleteIt)->nodeValue;
echo $toDelete;
>
the value of the link that has to be deleted is given -
this works.
>
Can anyone help me solving the problem or explaining why
the one works and the other doesn't?
I haven't run any tests, but: removeChild() is
removeChild(), not removeDescendant(). So if you're trying
to delete a link node that is a descendant of a bereich1
node, but NOT a child of that same bereich1 node, it
wouldn't (and shouldn't) work. What you probably need is
something along these lines (not tested, and I don't
remember the DOM bindings in the PHP5 DOM XML module off
the top of my head):

$okay = $toDelete -parentNode ->
removeChild ( $toDelete ) ;

--
Pavel Lepin

Closed Thread