Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

XML::XPath=HASH(0x10c4e230) is persistent

by medirecpr (Novice)
on Oct 01, 2012 at 20:55 UTC ( #996747=perlquestion: print w/replies, xml ) Need Help??
medirecpr has asked for the wisdom of the Perl Monks concerning the following question:

I have successfully read an xml file, gotten some info and stored it in a variable. Then I used the information in the variable to system grep another xml file, and store that in a variable. I want to use XPATH to get some info from that second XML, but can't. It gives the following errors:

Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/XML/Parser/ line 474.

and ..

no element found at line 1, column 0, byte -1: 28^ 7157840 at /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/XML/ line 187

Here is the code:

#!/usr/bin/perl -w use strict; use warnings; use XML::XPath; use MIME::Lite::TT; use File::Copy; use File::Find; use File::Grep qw( fgrep fmap fdo ); my $file = '/home/jramirez/20120811_XML_Reader_837/test.xml'; my $xp = XML::XPath->new(filename => $file); my $icncount = 1; my $transactioncount = 0; my $billedamount = 0; my $PayerName3 = ''; my $ICN = ''; my $BillingProvider = ''; my $line = ''; my $cmd = ''; my $Name = ''; my $xmlpath = ''; my $xmlname = ''; print $file . "\n"; print $xp . "\n"; foreach my $InterchangeControlHeader ($xp->find('//InterchangeControlH +eader')->get_nodelist){ my $InterchangeControlNumber13 = $InterchangeControlHeader->find(' +@InterchangeControlNumber13')->string_value; $ICN = $InterchangeControlNumber13 } foreach my $Transaction837P ($xp->find('//Transaction837P')->get_nodel +ist){ my $BillingProviderIdentifier9 = $Transaction837P->find('BillingPr +oviderHierarchicalLevelLoop/BillingProviderNameLoop/BillingProviderNa +me/@BillingProviderIdentifier9')->string_value; $BillingProvider = $BillingProviderIdentifier9; $PayerName3 = $Transaction837P->find('SubscriberHierarchicalLevelL +oop/PayerNameLoop/PayerName/@PayerName3')->string_value; $transactioncount++; } foreach my $ServiceLineNumberLoop ($xp->find('//ServiceLineNumberLoop' +)->get_nodelist){ my $AssignedNumberLine = $ServiceLineNumberLoop->find('Service +LineNumber/@AssignedNumber1')->string_value; my $LineItemChargeAmount2 = $ServiceLineNumberLoop->find('Prof +essionalService/@LineItemChargeAmount2')->string_value; if ($LineItemChargeAmount2 eq '') { $LineItemChargeAmount2 = 0; } $billedamount += $LineItemChargeAmount2; } print 'Billing Provider: ' . $BillingProvider . "\n"; print 'ICN: ' . $ICN . "\n"; print 'Payer: ' . $PayerName3 . "\n"; print 'Total Number Invoices: ' . $transactioncount . "\n"; print 'Total Billed: ' . $billedamount . "\n"; my $SESXML = `find /home/jramirez/PayerDownload/SES/backup/*xml -maxde +pth 1 -type f -exec grep -q $ICN '{}' ';' -exec echo '{}' ';' `; chomp $SESXML; my $sesxp = XML::XPath->new(filename => $SESXML); foreach my $interchange ($sesxp->find('//Interchange')->get_nodelist){ $Name = $interchange->find('Accept/@Name')->string_value; print $Name . "\n"; print "I think we got 'em, but we dont!" . "\n"; }

The objective is to read the first xml, gather unique identifiers that help me find the second xml. Once the second xml is found, i want to XPATH the info I need from it into variables. Then I'll use the variables to generate a simple txt report.

I printed out the $xp and $sesxp variables and noted that they have the same value, and guess I should clear that? can't find how to, must be googling the wrong terms.

I humbly ask for help.

Replies are listed 'Best First'.
Re: XML::XPath=HASH(0x10c4e230) is persistent
by kcott (Canon) on Oct 02, 2012 at 00:09 UTC

    G'day medirecpr,

    You don't show any code where you print $sesxp; however, this looks suspect:

    my $sesxp = XML::XPath->new(otherfilename => $SESXML); print 'SESXML: ' . $xp . "\n";

    Should that print statement contain $sesxp instead of $xp?

    Aside: I might just also point out that print takes a list of arguments - there's no need to concatenate the arguments. This would be fine:

    print 'SESXML: ', $xp, "\n";

    Or, removing most of the punctuation noise, you could just write:

    print "SESXML: $xp\n";

    -- Ken

      Thanks Ken, anything on the errors? Regards,
        "... anything on the errors?"

        You tell me. What have you investigated?

        • /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/XML/Parser/ is on your computer. What's happening at line 474?
        • /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/XML/ is on your computer. What's happening at line 187?
        • /home/jramirez/PayerDownload/SES/backup/ is on your computer. What *xml files did you `find ...` there?
        • You've invoked find(...) methods. Was anything found? If so, was that data suitable for chaining to subsequent methods? Again, this is data on your computer.

        I also see that you've changed your OP without indicating an update. I don't actually know if I'm responding to the original or some later modification.

        -- Ken

      I noticed your point on the print $xp. I changed the code, and now I get a different hash. But I still get the same errors:

      Use of uninitialized value in subroutine entry at /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/XML/Parser/ line 474.


      no element found at line 1, column 0, byte -1: 20^ 6985936 at /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/XML/ line 187

      Is there a particular way to open a second XML file for XPATH?

      Oh Ken, you are the best! Your silence made me look at my code with religious intent... I figured it out. I CHOMPED out the result from my grep and tada! I updated the code in case you care to see. In summation, this script can open up an XML, parse for info, save to variables... then it uses the variables to construct a search string. THEN, it uses that search string to bash grep another XML file in a diff directory with diff format and XPATH parse it at will. THANKS AGAIN MONKS!

        From your timezone, we appear to be on almost opposite sides of the planet: my "silence" was probably due to being asleep. :-)

        You'll learn a lot more by resolving issues yourself. In this instance, you were clearly capable of doing this; so let's hope you've gained something from the experience. At the very least, I detect happy feelings from achieving a positive outcome from the exercise.

        With regards to updating your code, that's at least two modifications to your OP without any indication (in your OP) of having done so. In future, please clearly show where you have made changes.

        -- Ken

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://996747]
Approved by kcott
[ambrus]: choroba: heh heh... I have such a doc bug report somewhere. fixed by now.

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (9)
As of 2017-02-27 12:05 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (383 votes). Check out past polls.