use strict;
use warnings;
use XML::Twig;
my $xmlStr = <<XML;
<doc>
<testcase1>
<step1 command ="Launchapp " param1 = "executablepath" param2 = "d
+irpath"/>
<step2 command = "Dothis"/>
<step3 command = "Changemode" param1 = "100"/>
<step4 command = "CaptureRectanlge" param1 = "3" param2 = "96" par
+am3 = "726" param4 = "580"/>
<step5 command = "CompareImage" image1 = "D:\\img1.jpg" image2 = "
+D:\\img2.jpg "/>
</testcase1>
<testcase2>
<step1 command ="Launchapp " param1 = "executablepath" param2 = "d
+irpath"/>
<step2 command = "Dothis"/>
<step3 command = "Changemode" param1 = "100"/>
<step4 command = "CaptureRectanlge" param1 = "3" param2 = "96" par
+am3 = "726" param4 = "580"/>
<step5 command = "CompareImage" image1 = "D:\\img1.jpg" image2 = "
+D:\\img2.jpg "/>
</testcase2>
</doc>
XML
my $twig = new XML::Twig(twig_handlers => {'*' => \&testcase});
$twig->parse($xmlStr);
sub testcase {
my ($twig, $testcase) = @_;
my $tag = $testcase->tag();
return 1 if $tag !~ /^testcase\d+$/;
print "$tag\n";
for my $step ($testcase->children()) {
my $tag = $step->tag();
my %attrs = %{$step->atts()};
print "Command: $attrs{'command'}(";
print join ', ', map {$attrs{$_}} grep {/^param/} sort keys %a
+ttrs;
print ")\n";
}
print "\n";
}
Prints:
testcase1
Command: Launchapp (executablepath, dirpath)
Command: Dothis()
Command: Changemode(100)
Command: CaptureRectanlge(3, 96, 726, 580)
Command: CompareImage()
testcase2
Command: Launchapp (executablepath, dirpath)
Command: Dothis()
Command: Changemode(100)
Command: CaptureRectanlge(3, 96, 726, 580)
Command: CompareImage()
This is somewhat messier than it ought be because the test case tags are all different. If the tags were 'testcase' and the case identifier were an attribute the twig_handlers expression could be just 'testcase' and the testing in the handler sub is no longer required.
True laziness is hard work
|