http://qs321.pair.com?node_id=782694

PolarSiva has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks
i need to edit a xml node using Perl. For example
<project>
 <run_count>
  <count>13</count>
 </run_count>
</project>
i have to change the value 13 to 14 in the above example other than using regular exp. Kindly suggest some tips.

Replies are listed 'Best First'.
Re: Edit a node value in xml
by toolic (Bishop) on Jul 23, 2009 at 15:10 UTC
    You could use a CPAN module, such as XML::Twig. The following code unconditionally replaces the text of all instances of 'count' elements with the value 14.
    use strict; use warnings; use XML::Twig; my $xmlStr = <<XML; <project> <run_count> <count>13</count> </run_count> </project> XML my $twig= new XML::Twig( PrettyPrint => 'indented', twig_handlers => { count => \&count } ); $twig->parse($xmlStr); $twig->print(); exit; sub count { my ($twig, $cnt) = @_; $cnt->set_text(14); } __END__ <project> <run_count> <count>14</count> </run_count> </project>

    Side note: Welcome to the Monastery. In general, it is better to use 'code' tags instead of 'pre' tags when posting code. (see Perl Monks Approved HTML tags)

      Thanks a lot toolic
      The code works great
Re: Edit a node value in xml
by ramrod (Curate) on Jul 23, 2009 at 15:59 UTC
    Using XML::LibXML
    use XML::LibXML; my $template = 'sample.xml'; my $parser = XML::LibXML->new(); my $doc = $parser->parse_file($template); my($object) = $doc->findnodes("/project/run_count/count/text()"); my $text = XML::LibXML::Text->new('14'); $object->replaceNode($text); open (my $Output, ">$template") or die "Could not write $template"; print $Output $doc->toString; close ($Output) or die "Could not close generated $template ";