Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
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 exploiting the Monastery: (6)
As of 2014-10-21 00:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (94 votes), past polls