Using XML::XSH2, a wrapper around XML::LibXML:
open SN.xml ;
$p := insert element prod append /root/category/subcat ;
set $p/@pname 'prod4' ;
set $p/@pid 'prod4' ;
save :b ;
Question
File: SN.xml
<?xml version="1.0"?>
<root>
<category name="Cat1" id="C1">
<subcat name="SCName1" sid="SC1">
<prod pname='prod1' pid='p1'></prod>
<prod pname='prod2' pid='p2'></prod>
<prod pname='prod3' pid='p3'></prod>
</subcat>
</category>
</root>
I want below output:
<?xml version="1.0"?>
<root>
<category name="Cat1" id="C1">
<subcat name="SCName1" sid="SC1">
<prod pname='prod1' pid='p1'></prod>
<prod pname='prod2' pid='p2'></prod>
<prod pname='prod3' pid='p3'></prod>
**<prod pname='prod4' pid='p4'></prod>**
</subcat>
</category>
</root>
Please help me to get this ouptput using modules.
Thanks in advance.
Solution
Using XML::XSH2, a wrapper around XML::LibXML:
open SN.xml ;
$p := insert element prod append /root/category/subcat ;
set $p/@pname 'prod4' ;
set $p/@pid 'prod4' ;
save :b ;
OTHER TIPS
You may use XML::DOM to append value in subcat element.
#!/usr/bin/perl
use strict;
use warnings;
use XML::DOM;
use File::Temp qw(tempfile);
my $str = <<F;
<?xml version="1.0"?>
<root>
<category name="Cat1" id="C1">
<subcat name="SCName1" sid="SC1">
<prod pname='prod1' pid='p1'></prod>
<prod pname='prod2' pid='p2'></prod>
<prod pname='prod3' pid='p3'></prod>
</subcat>
</category>
</root>
F
my ($fh, $filename) = tempfile();
print $fh $str;
close $fh;
my $parser = XML::DOM::Parser->new;
my $doc = $parser->parsefile($filename);
unlink $filename;
my $subcat = $doc->getElementsByTagName('subcat')->item(0);
my $prod = $doc->createElement('prod');
$prod->setAttribute(pname=>'prod4');
$prod->setAttribute(pid=>'p4');
$subcat->appendChild($prod);
print $doc->toString;
__END__
This gives output:
<?xml version="1.0"?>
<root>
<category name="Cat1" id="C1">
<subcat name="SCName1" sid="SC1">
<prod pname="prod1" pid="p1"/>
<prod pname="prod2" pid="p2"/>
<prod pname="prod3" pid="p3"/>
<prod pname="prod4" pid="p4"/></subcat>
</category>
</root>
Note! As you may see there is a little problem with indentation and I don't know how to quickly fix it.