Hi Rebecca,
You're getting the fatal error because you're trying to delete a child
which doesn't exist on the <xml_thingnode. <site is a child of
<language1>.
$language1Node = $xmldoc->getElementsByTagName("language1")->item(0);
$firstsiteNode = $language1Node->firstChild;
$language1Node->removeChild($firstSiteNode);
I've been using the DOM Functions for nearly 12 months on a project i'm
due to release at the end of this month and let me tell you, it's been
a helluva'n evolution.
You may find a lot of your code with
$node->firstChild->nextSibling->nextSibling and stuff like that. It's
can quite hard to read - consider making several functions called
removeLanguage($languagesNode,$lang_name){
for( $i = 0 ; $i < $languagesNode->length ; $i++ ){
if( strcmp($languagesNode->item($i)->nodeValue,$lang_name)==0)
$languagesNode->removeChild($languagesNode->item($i) ;
}
}
What this does is that you've passed in your languages root node and
the name of the language. On a match of the nodeValue (and the name of
the language you want to delete) it'll remove that child by doing a
string comparison.
A handy function would also be
getLanguagesNode($xmldoc){
return $xmldoc->getElementsByTagName("languages");
}
It may also be handy to review the structure of your document so that
it looks more like
<rootNode>
<languages>
<language>
<site>
<site>
<site>
</language>
<language>
...
...
</languages>
<moreNodes/>
</rootNode>
This way, all the languages will be in the <languagesnode rather than
calling each node languageX where X is akin to an id.
Hope this helps,
Mylo
P.S. I just found this post by chance whilst waiting for a d/l to
finish. I've never used google groups and was just curious, so i don't
know what the normal etiquette is in here, later
Rebecca Tsukalas wrote:
Hello,
I have a problem concerning removeChild. This is the XML structure I use with php:
<xml_thing>
<language1>
<site>bla1</site>
<site>bla2</site>
<site>bla3</site>
</language1>
<language2>
</language2>
</xml_thing>
now, if I want to delete the whole language1 I use the following code:
$toDelete=$xml_dom->getElementsByTagName('language1')->item(0);
$okay = $xml_dom->removeChild($toDelete);
but if I try to delete a site like that:
$toDelete=$xml_dom->getElementsByTagName('site')->item(0);
$okay = $xml_dom->removeChild($toDelete);
i get a Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error'
with google i found a hint how to solve the problem, it said that the removeChild method refers to the current selected node and that I have to use the method having selected the concerning Node. But how can I do this? Probably amateurish I tried to do it like this way:
$toDelete=$xml_dom->getElementsByTagName('language1')->item(0);
$toDelete=$toDelete->getElementsByTagName('site')->item(0);
normally I use SimpleXML to handle XML-files, but in SimpleXML there is no way to delete a child so I had to use DOM, which I think is very complicated - however I would be very thankful if someone could explain the above mentioned problem to me. thank you!
------=_NextPart_000_0009_01C6DF04.B9E25940
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
X-Google-AttachSize: 3098
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.2963" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT face=Arial size=2>Hello,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>I have a problem concerning removeChild. This
is the XML structure I use with php:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2><xml_thing> <BR> <language1>
<BR> <site>bla1</site>
<BR> <site>bla2</site>
<BR> <site>bla3</site>
<BR> </language1> <BR> <language2>
<BR> </language2> <BR></xml_thing> </FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT><FONT face=Arial size=2>now, if I want to delete the whole language1
I use the following code:</FONT></DIV>
<DIV><FONT face=Arial><FONT
size=2><STRONG>$toDelete=$xml_dom->getElementsByTagName('language1')->item(0);<BR>$okay
= $xml_dom->removeChild($toDelete);</STRONG><BR></FONT></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT></FONT><FONT
color=#0000bb></FONT> </DIV>
<DIV><FONT face=Arial size=2>but if I try to delete a site like
that:</FONT></DIV>
<DIV><FONT face=Arial
size=2><STRONG>$toDelete=$xml_dom->getElementsByTagName('site')->item(0);<BR>$okay
= $xml_dom->removeChild($toDelete);</STRONG></FONT></DIV>
<DIV><STRONG><FONT face=Arial size=2></FONT></STRONG> </DIV>
<DIV><FONT face=Arial size=2>i get a <STRONG>Fatal error: Uncaught exception
'DOMException' with message 'Not Found Error'</STRONG</FONT></DIV>
<DIV><STRONG><FONT face=Arial size=2></FONT></STRONG> </DIV>
<DIV><FONT face=Arial size=2>with google i found a hint how to solve the
problem, it said that the removeChild method refers to the current selected node
and that I have to use the method having selected the concerning Node. But how
can I do this? Probably amateurish I tried to do it like this
way:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><STRONG><FONT face=Arial
size=2>$toDelete=$xml_dom->getElementsByTagName('language1')->item(0);</FONT></STRONG></DIV>
<DIV><STRONG><FONT face=Arial
size=2>$toDelete=$toDelete->getElementsByTagName('site')->item(0);</FONT></STRONG></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>normally I use SimpleXML to handle XML-files,
but in SimpleXML there is no way to delete a child so I had to use DOM, which I
think is very complicated - however I would be very thankful if someone could
explain the above mentioned problem to me. thank you!</FONT></DIV></BODY></HTML>
------=_NextPart_000_0009_01C6DF04.B9E25940--