in reply to Re^3: XML::LibXML and namespaces
in thread XML::LibXML and namespaces

xpather.pl says
/*[ local-name() = "user" and position() = 1 ] /*[ local-name() = "address" and position() = 2 and @name = "2" ] /*[ local-name() = "entry" and @name = "Address line 2" and contains(string(), "suburb2") ]
So maybe you use
/*[ local-name() = "user" ] /*[ local-name() = "address" ] /*[ local-name() = "entry" and @name = "Address line 2" ]
or any number of things like that
//entry[ @name = "Address line 2" ]

Replies are listed 'Best First'.
Re^5: XML::LibXML and namespaces
by seanc (Novice) on Oct 04, 2014 at 08:45 UTC

    xpather.pl looks like it will prove really useful. Thanks!

    I'm drifting way off topic here, but what I've got now is probably the most inefficient way of dealing with the problem:

    My XML looks like this:

    <user> <address name="1"> <entry name="Address line 1">street</entry> <entry name="Address line 2">suburb</entry> <entry name="Postal code">code</entry> </address> <address name="2"> <entry name="Address line 1">street2</entry> <entry name="Address line 2">suburb2</entry> <entry name="Postal code">code2</entry> </address> </user>

    I want to extract each of those address lines into variables, so I'm doing this:

    my ( $addr_1_line_1, $addr_1_line_2 ); for my $node ( $user->findnodes( q{ ./*[ local-name()="address" and @name = "1"] } )) { for my $subnode ( $node->findnodes( q{ ./*[ @name="Address line 1" ] } ) ) { $addr_1_line_1 = $subnode->textContent(); } for my $subnode ( $node->findnodes( q{ ./*[ @name="Address line 2" ] } ) ) { $addr_1_line_2 = $subnode->textContent(); } }
    It does appear to work, but is there a more efficient way of doing this?