in reply to parsing & retrieving from an XML file

I have written the code using XML::Smart, as perl in my box is not an updated one. Also, I have tweaked the XML a little bit.

XML:

<OUTMOST> <MYENVDETAILS> <ENVDETAILS id="abc" > <DMGRHOST>a.b.c.d</DMGRHOST> <CELL>XYZ</CELL> <NODEDETAIL nodeid="1" NODEHOST="v.x.y.z" > <IHSNODE>v_ihsnode</IHSNODE> <IHSJVM ihsjvmtype="log_ihs" > <IHSJVMNAME>abc_logihs1</IHSJV +MNAME> </IHSJVM> <JVM jvmtype="api" > <JVMNAME>abc_api1.1</JVMNAME> <JVMNAME>abc_api1.2</JVMNAME> </JVM> </NODEDETAIL> </ENVDETAILS> </MYENVDETAILS> </OUTMOST>

Execution

----- myaccount v.x.y.z /appl/ ----- $ ./my_topologyParser.pl fetch abc ----- myaccount v.x.y.z /appl/ ----- $ ./my_topologyParser.pl nodesall v.x.y.z ----- myaccount v.x.y.z /appl/ ----- $ ./my_topologyParser.pl abc nodewrtseg v.x.y.z ----- myaccount v.x.y.z /appl/ ----- $ ./my_topologyParser.pl abc jvmtype api abc_api1.1 abc_api1.2 ----- myaccount v.x.y.z /appl/ ----- $ ./my_topologyParser.pl abc jvmwrtnode v.x.y.z api abc_api1.1 abc_api1.2 ----- myaccount v.x.y.z /appl/ ----- $ ./my_topologyParser.pl abc nodewrtjvm abc_api1.2 v.x.y.z ----- myaccount v.x.y.z /appl/ -----

Actual Code

#!/appl/perl/bin/perl use XML::Smart; use strict; use warnings; $ENVFILE="/appl/test_MYENV_Top.xml"; my $ENVxml = XML::Smart->new($ENVFILE) || die ("Could not find file.") +; my $env = $ARGV[0]; if ( $ARGV[0] eq "fetch" ) { my @envname=$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVDETAILS}(' +[@]','id'); foreach my $i (@envname) { print "$i\n"; } } elsif ($ARGV[0] eq "nodesall"){ my @envname=$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVDETAILS}(' +[@]','id'); foreach my $i (@envname) { my @nodename=$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVD +ETAILS}->('id','eq',"$i")->{NODEDETAIL}('[@]','NODEHOST'); foreach my $c (@nodename) { print "$c\n"; } } } elsif ($ARGV[1] eq "nodewrtseg"){ my @nodename=$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVDETAILS}- +>('id','eq',"$env")->{NODEDETAIL}('[@]','NODEHOST'); foreach my $i (@nodename) { print "$i\n"; } } elsif ($ARGV[1] eq "jvmtype") { my $typeCheck=$ARGV[2]; my @jvmlist; my @nodename=$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVDETAILS}- +>('id','eq',"$env")->{NODEDETAIL}('[@]','NODEHOST'); if ($#nodename < 0){ exit 1; } foreach my $i (@nodename) { my @names=@{$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVDE +TAILS}->('id','eq',"$env")->{NODEDETAIL}->('NODEHOST','eq',"$i")->{JV +M}->('jvmtype','eq',"$typeCheck")->{JVMNAME}}; if ($#names > 0){ push(@jvmlist,@names); } } @jvmlist = grep /\S/, @jvmlist; if ($#jvmlist < 0){ print " No $typeCheck type jvm found on $env . Incorre +ct jvm type passed.\n"; exit 1; } foreach my $c (@jvmlist) { print "$c\n"; } } elsif ($ARGV[1] eq "jvmwrtnode") { my $nodeCheck=$ARGV[2]; my $typeCheck=$ARGV[3]; if (defined $nodeCheck && defined $typeCheck){ my @names=@{$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVDE +TAILS}->('id','eq',"$env")->{NODEDETAIL}->('NODEHOST','eq',"$nodeChec +k")->{JVM}->('jvmtype','eq',"$typeCheck")->{JVMNAME}}; if ($#names < 0){ print " No $typeCheck type jvm found on $nodeC +heck node. Incorrect type/nodename passed.\n"; exit 1; } @names = grep /\S/, @names; foreach my $c (@names) { print "$c\n"; } } else { print " No Node type or nodename passed. Incorrect no. + of arguments passed.\n"; exit 1; } } elsif ($ARGV[1] eq "nodewrtjvm") { my $jvmCheck=$ARGV[2]; if (defined $jvmCheck){ my @nodename=$ENVxml->{OUTMOST}->{MYENVDETAILS}->{ENVD +ETAILS}->('id','eq',"$env")->{NODEDETAIL}('[@]','NODEHOST'); if ($#nodename < 0){ exit 1; } OUTER: foreach my $i (@nodename) { my @jvmtypes=$ENVxml->{OUTMOST}->{MYENVDETAILS +}->{ENVDETAILS}->('id','eq',"$env")->{NODEDETAIL}('NODEHOST','eq',"$i +")->{JVM}('[@]','jvmtype'); foreach my $k (@jvmtypes) { my @names = @{$ENVxml->{OUTMOST}->{MYE +NVDETAILS}->{ENVDETAILS}->('id','eq',"$env")->{NODEDETAIL}->('NODEHOS +T','eq',"$i")->{JVM}('jvmtype','eq',"$k")->{JVMNAME}}; if ($#names >= 0){ foreach (@names){ if ( $_ eq $jvmCheck ){ print "$i\n"; last OUTER; } } } } } } } else{ print "\nThis parser is argument specific."; print "\n1). $0 fetch : To list out environments"; print "\n2). $0 nodesall : To list all nodes of all environmen +ts."; print "\n3). $0 <segID> nodewrtseg : to list all nodes of spec +ific environment."; print "\n4). $0 <segID> jvmtype <typeofjvm> : to list all node +s having specified jvmtypes of the specific environment."; print "\n5). $0 <segID> jvmwrtnode <nodename> <typeofjvm> : to + list all jvms present on specific node of specific type of the envir +onment."; print "\n6). $0 <segID> nodewrtjvm <jvmname> : to list the nod +e of specific jvm of specified environment.\n"; }

I know I could have used getopts, however, I was in a hurry :)