Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Help debugging xpath in Perl

by tweetiepooh (Hermit)
on Mar 12, 2021 at 17:29 UTC ( [id://11129518]=perlquestion: print w/replies, xml ) Need Help??

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

Greetings Perl Monkers

I've been parsing some XML files using Perl and XML::Twig. I've got the bulk working but I need to parse a final, separate file just extracting out one bit of data. I can to it with xmllint on the command line using - xmllint --format portletEntities.xml --xpath '//*[@name="FilterName"]/*/text()' | sort | uniq

I'd like to get this to work in the Perl code so the values I pull from this search with the other data, in the example below I want "Name_of_filter". Using xmllint with //*[@name="FilterName"]the surrounding data looks like

<portletentities:adminPrefs name="FilterName" readOnly="false"><portletentities:value>Name_of_filter</portletentities:value></portletentities:adminPrefs>

There 72 entries in raw, 56 unique. In Perl I'm trying this

130 sub parsepages { 131 my $filename = "portlentEntities.xml"; 132 133 my $p = XML::Twig->new( 134 twig_handlers => { 135 '//*[@name="FilterName"]/*/text()' => sub {$_->print} 136 }, 137 ); 138 139 $p->parsefile($filename); 140 }

Leads to this

unrecognized expression in handler: '//*[@name="FilterName"]/*/text()' at ./xmlp.pl line 137.

Replies are listed 'Best First'.
Re: Help debugging xpath in Perl
by choroba (Cardinal) on Mar 12, 2021 at 19:27 UTC
    It seems XML::Twig doesn't understand /text(). But maybe you don't need it? This seems to work:
    '//*[@name="FilterName"]/*' => sub {print $_->text}

    If you want to use the full XPath, switch to XML::LibXML. For large files, you can use its XML::LibXML::Reader. To experiment with XPath, you can use XML::XSH2, which is like xmllint combined with Perl.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
      Super, that cracked it. Many thanks. Now to pull all the little bits of data together.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11129518]
Approved by davies
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (1)
As of 2024-04-19 00:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found