NAME
PPIx::XPath - an XPath implementation for the PDOM
VERSION
version 2.02
SYNOPSIS
use PPI;
use PPIx::XPath;
use Tree::XPathEngine;
my $pdom = PPI::Document->new('some_code.pl');
my $xpath = Tree::XPathEngine->new();
my @subs = $xpath->findnodes('//Statement-Sub',$pdom);
my @vars = $xpath->findnodes('//Token-Symbol',$pdom);
Deprecated interface, backward-compatible with PPIx::XPath
version 1:
use PPIx::XPath;
my $pxp = PPIx::XPath->new("some_code.pl");
my @subs = $pxp->match("//Statement::Sub");
my $vars = $pxp->match("//Token::Symbol");
DESCRIPTION
This module augments PPI's classes with the methods required by Tree::XPathEngine, allowing you to perform complex XPath matches against any PDOM tree.
See Tree::XPathEngine for details about its methods.
Mapping the PDOM to the XPath data model
Each node in the PDOM is an element as seen by XPath
The name of the element is the class name of the node, minus the
initial
PPI::
, with::
replaced by-
. That is:($xpath_name = substr($pdom_node->class,5)) =~ s/::/-/g;
Only "significant" nodes are seen by XPath
all scalar-valued accessors of PDOM nodes are visible as attributes
"here-docs" contents are not mapped
METHODS
new
my $pxp = PPIx::XPath->new("some_code.pl");
my $pxp = PPIx::XPath->new($pdom);
Only useful for the backward-compatible, and deprecated, interface. Returns an instance of PPIx::XPath
tied to the given document.
clean_xpath_expr
my $new_xpath_expr = $pxp->clean_xpath_expr($old_xpath_expr);
PPIx::XPath
version 1.0.0 allowed the use of partial package names (like Token::Number
) as element names: this collides with the axis specification of proper XPath. For this reason, in newer version of PPIx::XPath
, the element name is the class name of the PDOM node, minus the initial PPI::
, with ::
replaced by -
(like Token-Number
).
This method replaces all occurrences of PPI package names in the given string with the new names.
match
my @subs = $pxp->match("//Statement::Sub");
my $vars = $pxp->match("//Token::Symbol");
Only useful for the backward-compatible, and deprecated, interface. From the document this instance was built against, returns the nodes that match the given XPath expression.
You should not use this method, you should call findnodes
instead:
my $xpath = Tree::XPathEngine->new();
my @subs = $xpath->findnodes('//Statement-Sub',$pdom);
my @vars = $xpath->findnodes('//Token-Symbol',$pdom);
BUGS and LIMITATIONS
"here-docs" contents are not mapped
node ordering is slow, because I could not find a way in PPI to
compare two nodes for document order; suggestions are most welcome
SEE ALSO
http://www.w3.org/TR/xpath (the XPath specification)
AUTHORS
Dan Brook <cpan@broquaint.com> original author
Gianni Ceccarelli <dakkar@thenautilus.net> Tree::XPathEngine-based re-implementation
COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Gianni Ceccarelli <dakkar@thenautilus.net>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.