Royeh
Royeh

Reputation: 443

Readig XML file from Perl

I have some XML file which contains "Squishreport". I want to look for some special value of all nodes under condition. To do so, I have written a code in Perl that the main function is as follows:

sub FileCount
{
chdir( $dir ) or die "Couldn't go inside $dir directory, $!";
opendir(my $dh, $dir) or die "$0: $dir: $!\n";
while (my $file = readdir($dh)) {
    # We only want files
     next unless (-f "$dir/$file");
    # Use a regular expression to find files ending in .xml
     next unless ($file =~ m/$suff$/);

     my $xml = XML::LibXML->load_xml(location => $file);

    # Iterate the entries

    for my $test ($xml->findnodes('/SquishReport/test/test')) {
        my $name_test = $test->findvalue('@name');
        # trim the value
         s/\A\s*//, s/\s*\z// for my $value_test = $test->textContent;

        print "Test Name = $name_test \n";

        for my $result ($test->findnodes('/verification/result')) {
            my $type_result = $result->findvalue('@type');

            # trim the value
             s/\A\s*//, s/\s*\z// for my $value = $result->textContent;
             print "$type_result = $value \n";
            if (($type_result eq "WARNING") || ($type_result eq "FAIL") || ($type_result eq "ERROR") || ($type_result eq "FATAL")){
                print "$type_result = $value \n";
                print "***********  $name_test is not OK *********** \n\n "; 
            }
            else{
                print "***********  $name_test is OK *********** \n\n ";
            }
        }
        print "\n";
    }
    #}
     print "$file\n";       
     $count = $count + 1;
}
closedir($dh);
if ($count eq 1){
    print "There is only one file in '' $dir '' directory.";
}
else{
    print "There are $count files in '' $dir '' directory.";
}   

}

The goal is looking for the first test and type the name. Now if it there is PASS in type then write the name of test and says is OK, otherwise writes is not OK.

I am not sure if the code is the right code for the structure/goal.

My problem is that the inner for loop does not work. the instruction for XML file is as:

<SquishReport>
     <test name="abcd">
         <test name="EFGH">
             <verification .......>
                  <result type="PASS">
                         <description>version check test case passes!</description>
                         <description type="DETAILED"></description>
    .
    .
    .         
         <test name=IJKLM">
             <verification .......>
                  <result type="PASS">
                         <description>version check test case passes!</description>
                         <description type="DETAILED"></description>

**Edit: ** Here is the XML file:

<SquishReport>
<test name="mat_tst_versions">
    <prolog time="2015-06-16T13:49:54+02:00"/>
    <message type="FATAL" time="2015-06-16T13:50:54+02:00">
        <description><![CDATA[Execution error]]></description>
        <description type="DETAILED"><![CDATA[squishrunner exited with code 3 when executing tst_start_app]]></description>
    </message>
    <test name="tst_check_versions">
        <prolog time="2015-06-16T13:50:55+02:00"/>
        <message line="274" type="LOG" file="C:\test\scripts\utilities.py" time="2015-06-16T13:50:59+02:00">
            <description><![CDATA[is 64 bit windows version: True]]></description>
        </message>            
        <message line="124" type="LOG" file="C:\test\mat_tst\tst_check_versions\test.py" time="2015-06-16T13:50:59+02:00">
            <description><![CDATA[    path exists!]]></description>
        </message>
        <message line="129" type="FAIL" file="C:\test\mat_tst\tst_check_versions\test.py" time="2015-06-16T13:50:59+02:00">
            <description><![CDATA[expected version: 1.0.0.107]]></description>
        </message>
        <verification line="132" type="" name="" file="C:\test\mat_tst\tst_check_versions\test.py">
            <result type="PASS" time="2015-06-16T13:50:59+02:00">
                <description>version check test case passes!</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <epilog time="2015-06-16T13:50:59+02:00"/>
    </test>        
    <test name="tst_scheduler_1">
        <prolog time="2015-06-16T13:51:00+02:00"/>
        <message line="62" type="LOG" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:51:00+02:00">
            <description><![CDATA[count = 0]]></description>
        </message>
        <message line="125" type="LOG" file="C:\test\scripts\start_stop.py" time="2015-06-16T13:51:06+02:00">
            <description><![CDATA[duration of start of C: 5132ms]]></description>
        </message>
        <message line="172" type="LOG" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:51:19+02:00">
            <description><![CDATA[application name = C]]></description>
        </message>
        <message line="184" type="LOG" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:51:19+02:00">
            <description><![CDATA[start application: C]]></description>
        </message>
        <message line="213" type="LOG" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:51:19+02:00">
            <description><![CDATA[Scheduler Label exists]]></description>
        </message>
        <message line="219" type="LOG" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:51:19+02:00">
            <description><![CDATA[Scheduler Counter exists]]></description>
        </message>
        <verification line="368" type="" name="" file="C:\test\mat_tst\tst_scheduler_1\test.py">
            <result type="FAIL" time="2015-06-16T13:52:01+02:00">
                <description>different types elements</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <verification line="369" type="" name="" file="C:\test\mat_tst\tst_scheduler_1\test.py">
            <result type="FAIL" time="2015-06-16T13:52:01+02:00">
                <description>name_list= ['Scheduler', 'NCU', 'PLCSimAdv', 'simNCK', 'MCP']</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <verification line="370" type="" name="" file="C:\test\mat_tst\tst_scheduler_1\test.py">
            <result type="FAIL" time="2015-06-16T13:52:01+02:00">
                <description>typ_list= ['Scheduler', u'NCU', u'PLCSimAdv']</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <message line="393" type="LOG" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:52:08+02:00">
            <description><![CDATA[:840evoVC.lblClockCounter_Edit = 0]]></description>
        </message>
        <verification line="411" type="" name="" file="C:\test\mat_tst\tst_scheduler_1\test.py">
            <result type="FAIL" time="2015-06-16T13:52:08+02:00">
                <description>scheduler counter 1. read, n=0: Scheduler= 0</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <verification line="414" type="" name="" file="C:\test\mat_tst\tst_scheduler_1\test.py">
            <result type="FAIL" time="2015-06-16T13:52:08+02:00">
                <description>scheduler counter 2. read, n=0: Scheduler= 0</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <message line="421" type="LOG" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:52:08+02:00">
            <description><![CDATA[scheduler counter 1. read < counter 2. read, n=0: Scheduler= 0]]></description>
        </message>
        <message line="484" type="ERROR" file="C:\test\mat_tst\tst_scheduler_1\test.py" time="2015-06-16T13:52:29+02:00">
            <description><![CDATA[Script Error]]></description>
            <description type="DETAILED"><![CDATA[LookupError: Object ':840evoVC.chkSchedule_CheckBox_2' not ready.]]></description>
        </message>
        <epilog time="2015-06-16T13:52:29+02:00"/>
    </test>
    <test name="tst_run_plc">
        <prolog time="2015-06-16T13:52:30+02:00"/>
        <verification line="45" type="" name="" file="C:\test\mat_tst\tst_run_plc\test.py">
            <result type="FAIL" time="2015-06-16T13:52:30+02:00">
                <description>user path folder already exists!</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <message line="125" type="LOG" file="C:\test\scripts\start_stop.py" time="2015-06-16T13:52:34+02:00">
            <description><![CDATA[duration of start of 840evoVC: 4263ms]]></description>
        </message>
        <message line="54" type="LOG" file="C:\test\mat_tst_840evovc\tst_run_plc\test.py" time="2015-06-16T13:52:34+02:00">
            <description><![CDATA[start ok, duration = 4263000]]></description>
        </message>
        <message line="64" type="LOG" file="C:\test\mat_tst_840evovc\tst_run_plc\test.py" time="2015-06-16T13:52:34+02:00">
            <description><![CDATA[application started: 840evoVC]]></description>
        </message>
        <message line="78" type="LOG" file="C:\test\mat_tst_840evovc\tst_run_plc\test.py" time="2015-06-16T13:52:39+02:00">
            <description><![CDATA[PLC Sim Advanced tmp user files are the expected files]]></description>
        </message>
        <message line="263" type="LOG" file="C:\test\scripts\start_stop.py" time="2015-06-16T13:52:45+02:00">
            <description><![CDATA[all applications are closed]]></description>
        </message>
        <message line="87" type="LOG" file="C:\test\mat_tst_840evovc\tst_run_plc\test.py" time="2015-06-16T13:52:45+02:00">
            <description><![CDATA[close application ok]]></description>
        </message>
        <epilog time="2015-06-16T13:52:45+02:00"/>
    </test>
    <test name="tst_app_resources">
        <prolog time="2015-06-16T13:52:47+02:00"/>
        <message line="65" type="LOG" file="C:\test\mat_tst\tst_app_resources\test.py" time="2015-06-16T13:52:49+02:00">
            <description><![CDATA[count:0]]></description>
        </message>
        <message line="125" type="LOG" file="C:\test\scripts\start_stop.py" time="2015-06-16T13:52:53+02:00">
            <description><![CDATA[duration of start: 4176ms]]></description>
        </message>
        <message line="73" type="LOG" file="C:\test\mat_tst\tst_app_resources\test.py" time="2015-06-16T13:52:53+02:00">
            <description><![CDATA[start ok, duration = 4176000]]></description>
        </message>
        <message line="43" type="LOG" file="C:\test\scripts\win32utilities.py" time="2015-06-16T13:53:00+02:00">
            <description><![CDATA[Application 840evovc only exists once]]></description>
        </message>            
        <message line="138" type="ERROR" file="C:\test\mat_tst_\tst_app_resources\test.py" time="2015-06-16T13:53:30+02:00">
            <description><![CDATA[Script Error]]></description>
            <description type="DETAILED"><![CDATA[LookupError: Object ':chkSchedule_CheckBox_2' not ready.
                Called from:
            C:\test\mat_tst\tst_app_resources\test.py: 82]]></description>
        </message>
        <epilog time="2015-06-16T13:53:30+02:00"/>
    </test>
    <test name="tst_reset">
        <prolog time="2015-06-16T13:53:32+02:00"/>   
        <message line="260" type="LOG" file="C:\test\scripts\start_stop.py" time="2015-06-16T13:56:12+02:00">
            <description><![CDATA[Process exited.]]></description>          
        </message>
        <message line="263" type="LOG" file="C:\test\scripts\start_stop.py" time="2015-06-16T13:56:12+02:00">
            <description><![CDATA[all applications are closed]]></description>
        </message>
        <message line="284" type="LOG" file="C:\test\mat_tst\tst_reset\test.py" time="2015-06-16T13:56:12+02:00">
            <description><![CDATA[application closed]]></description>
        </message>
        <verification line="287" type="" name="" file="C:\test\mat_tst\tst_reset\test.py">
            <result type="PASS" time="2015-06-16T13:56:12+02:00">
                <description>tst_reset_1 ok</description>
                <description type="DETAILED"></description>
            </result>
        </verification>
        <epilog time="2015-06-16T13:56:12+02:00"/>
    </test>
    <epilog time="2015-06-16T13:56:13+02:00"/>
</test>

Upvotes: 0

Views: 29

Answers (1)

Sobrique
Sobrique

Reputation: 53498

This won't help:

  • if ($count eq 1) - that should be ==
  • Rather than readdir with filtering, why not just use glob ( "$dir/*.xml" )?
  • my $xml = XML::LibXML->load_xml(location => $file); could be breaking, because you're not changing directory. (so location should probably be $dir/$file - a problem which using the above glob avoids)

However the core of your problem is this:

for my $result ( $test->findnodes('/verification/result') ) {

Change it to:

for my $result ( $test->findnodes('./verification/result') ) {

And you'll get:

Test Name = tst_app_resources 

Test Name = tst_reset 
***********  tst_reset is OK *********** 

Upvotes: 2

Related Questions