Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re^3: XML::LibXML and namespaces

by Anonymous Monk
on Oct 03, 2014 at 12:30 UTC ( [id://1102731]=note: print w/replies, xml ) Need Help??


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

I'm getting myself hopelessly confused with something similar. 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>
How can I retrieve suburb2 from that?

Replies are listed 'Best First'.
Re^4: XML::LibXML and namespaces
by Anonymous Monk on Oct 04, 2014 at 06:19 UTC
    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" ]

      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?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1102731]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (3)
As of 2024-04-16 14:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found