Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re^2: XML::LibXML and namespaces

by Anonymous Monk
on Nov 11, 2012 at 13:33 UTC ( #1003330=note: print w/ replies, xml ) Need Help??


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

Wouldn't you know it :) xpath allows ignoring namespaces by using functions name and local-name, and the current node (.) comes in handy , heady even

#!/usr/bin/perl -- use strict; use warnings; use XML::LibXML; my $doc = XML::LibXML->new()->parse_string( q{<?xml version='1.0' ?> <roshambo xmlns="http://example.com/roshambo"> <sham> <bo name="40" /> <bo name="2" /> </sham> <sham xmlns:ftt="http://example.com/roshambo"> <ftt:bo name="forty" /> <ftt:bo name="two" /> </sham> </roshambo> } ); for my $name ( $doc->findnodes( q{//*[local-name()="bo"]/@name} ) ) { printf "%-25s %s\n", $name->nodePath, $name->nodeValue; } print "\n\n"; for my $node ( $doc->findnodes( q{//*[name()="sham"]} ) ) { print "@{[ $node->nodePath ]}\n"; ## any children ## ./* ## any descendants ## .//* ## anywhere ## //* for my $name ( $node->findnodes( q{./*[local-name()="bo"]/@name} ) + ) { printf "%-25s %s\n", $name->nodePath, $name->nodeValue; } print "\n\n"; } __END__ /*/*[1]/*[1]/@name 40 /*/*[1]/*[2]/@name 2 /*/*[2]/ftt:bo[1]/@name forty /*/*[2]/ftt:bo[2]/@name two /*/*[1] /*/*[1]/*[1]/@name 40 /*/*[1]/*[2]/@name 2 /*/*[2] /*/*[2]/ftt:bo[1]/@name forty /*/*[2]/ftt:bo[2]/@name two


Comment on Re^2: XML::LibXML and namespaces
Download Code
Re^3: XML::LibXML and namespaces
by Anonymous Monk on Aug 19, 2014 at 13:20 UTC
    Awesome! Exactly what I needed.
Re^3: XML::LibXML and namespaces
by Anonymous Monk on Oct 03, 2014 at 12:30 UTC
    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?
      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
Node Status?
node history
Node Type: note [id://1003330]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (7)
As of 2015-07-01 23:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (24 votes), past polls