in reply to Lib::XML removing Node

I need to remove one of the <new> nodes.

...is a difficult thing to put into code. Either of two? Duplicate tags? Tags with duplicate values? Last one? All after first? Here's snippet that does the last one. Use the docs -- XML::LibXML -- to adjust as needed.

use warnings; use strict; use XML::LibXML; my $doc = XML::LibXML->new->parse_fh(\*DATA); # or ->parse_file("news.xml") my $root = $doc->getDocumentElement; my @nodes = $root->findnodes("new"); $root->removeChild($nodes[-1]); # Remove the last. print $doc->serialize();# Or... print $root->serialize(); __DATA__ <listaNews> <new> blah blah blah </new> <new> blah blah blah </new> </listaNews>

Replies are listed 'Best First'.
Re^2: Lib::XML removing Node
by ikegami (Patriarch) on Jun 13, 2009 at 22:03 UTC

    The following is a more general solution. It doesn't rely on knowing the parent.

    my $node = ...; # Node to delete $node->parentNode->removeChild( $node );

    It's the same in XML::DOM (which the OP mentioned).

    my $node = ...; # Node to delete $node->getParentNode->removeChild( $node );
Re^2: Lib::XML removing Node
by smattiuz (Initiate) on Jun 13, 2009 at 21:56 UTC
    thanks mate, that worked :D i'll try to modify your solution to delete all elements and delete one specific one, then i'll post it to other users :D thanks!!!!!!!

      Sure thing. ikegami's suggestion is probably the most portable way to handle it too. It skips some of the node nonsense (naked text between elements are nodes|children too) and it is the way I usually do it in code. This would remove any after the first of a given TAGNAME.

      my @nodes = $doc->findnodes("//TAGNAME"); if ( @nodes > 1 ) { $_->getParentNode->removeChild($_) for @nodes[1..$#nodes]; }
      yes! everything went good! i modified the code to delete last inserted items and all items older than the current date. This all was for a university exam (HTML,CSS,XML,PERL,JAVASCRIPT), teacher gave me 28 out of 30 for my project (since it had a little issue with css in internet explorer! Really appreciated all your help!