Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks!
I am parsing a XML file and having problems when trying to reach a specific node only when the value of the node above matches a certain value. I mean that I can only read the values of <Id></Id> if the value of <Type></Type> is equal to "LN". After the code is done I would like to have only the results for the "ID" tag that have "Type" equal to "LN", it should be WXY12345678 and 12345678XZW because the tag "Type" is equal to "LN". I hope I made myself clear but here is a sample of what I am trying to get done, but instead I am getting all values for the "Id" tags.

#!/usr/bin/perl use warnings; use strict; my $a = do {local $/; <DATA>}; use XML::XPath; use XML::XPath::XMLParser; my $xp = XML::XPath->new(xml => $a); my $nodeset = $xp->findnodes('/OPEN/Info/Other/Id'); foreach my $cid ($xp->findnodes('/OPEN/more/Info/Other')) { my $id = $cid->find('Id'); print "**$id**\n"; } __DATA__ <?xml version="1.0" encoding="ISO-8859-1"?> <OPEN> <more> <Info> <Other> <Type>Key</Type> <Id>CONVERSE1</Id> </Other> <Other> <Type>Number</Type> <Id>1</Id> </Other> <Other> <Type>Sum</Type> <Id/> </Other> <Other> <Type>LN</Type> <Id>WXY12345678</Id> </Other> </Info> </more> <more> <Info> <Other> <Type>Key</Type> <Id>CONVERSE2</Id> </Other> <Other> <Type>Number</Type> <Id>11</Id> </Other> <Other> <Type>Sum</Type> <Id/> </Other> <Other> <Type>LN</Type> <Id>12345678XZW</Id> </Other> </Info> </more> </OPEN>

Thanks for the help!!!

Replies are listed 'Best First'.
Re: Reaching Nodes Help with XML::XPath
by ikegami (Patriarch) on May 12, 2010 at 19:24 UTC
    //Info/Other[Type/text()="LN"]/Id
    use strict; use warnings; use XML::LibXML qw( ); my $root = XML::LibXML->new->parse_fh(*DATA)->documentElement(); for my $node ( $root->findnodes( '//Info/Other[Type/text()="LN"]/Id' ) ) { print($node->textContent(), "\n"); } __DATA__ <?xml version="1.0" encoding="ISO-8859-1"?> <OPEN> ... </OPEN>
    WXY12345678 12345678XZW

    Update: Added test code.

      I have to use;
      use XML::XPath; use XML::XPath::XMLParser;

      Can it still be done?
        You tell me. I gave an XPath as requested.