2

I have the following XML file:

<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1">
      <CIFS_SERVICE NETBIOSNAME="serv1"/>
  </SERVER>
  <SERVER HOSTNAME="serv2">
  </SERVER>
<SOURCE_SERVER>

Now, I want to add child <CIFS_SERVICE NETBIOSNAME="serv2"/> to <SERVER HOSTNAME="serv2">. How do I do this using XML::Twig?

mirod
  • 15,603
  • 3
  • 46
  • 65
Ninja
  • 5,047
  • 5
  • 34
  • 57

1 Answers1

5

Here is a solution incorporating what I think are reasonable fixes to your question. The code below is based on the filtering example given in the documentation.

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t = XML::Twig->new(
    twig_roots => { SERVER => \&update },
    twig_print_outside_roots => 1,
);

$t->parse(\*DATA);

sub update {
    my ($t, $server) = @_;
    if ( 'serv2' eq $server->att('HOSTNAME') ) {
        $server->insert(
            CIFS_SERVICE => { NETBIOSNAME => 'serv2' },
        );
    }
    $server->print;
}


__DATA__
<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1">
      <CIFS_SERVICE NETBIOSNAME="serv1" />
  </SERVER>
  <SERVER HOSTNAME="serv2">
  </SERVER>
</SOURCE_SERVER>

Output:

C:\Temp> x
<SOURCE_SERVER>
  <SERVER HOSTNAME="serv1"><CIFS_SERVICE NETBIOSNAME="serv1"/></SERVER>
  <SERVER HOSTNAME="serv2"><CIFS_SERVICE NETBIOSNAME="serv2"/></SERVER>
</SOURCE_SERVER>
Sinan Ünür
  • 115,191
  • 15
  • 191
  • 333
  • Sinan, thanks a ton for your answer. However, I have one more query. Actually my xml looks like this: ` ` So, I don't need to insert tag. The twig points to SERVER and I need to set attribute of it's child. How do I do it? Please help me. – Ninja Aug 11 '09 at 19:08
  • Thanks a lot for your answer Sinan! – Ninja Aug 13 '09 at 05:09