http://qs1969.pair.com?node_id=11129518

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.