XML-TreePP-XMLPath
view release on metacpan or search on metacpan
lib/XML/TreePP/XMLPath.pm view on Meta::CPAN
Second, parse the elements from step 1 that have key/val pairs, such that
each single key/val is contained by the [ and ] characters
my $el = charlexsplit (
string => q( path[@key='val'][@key2='val2'] ),
boundry_start => '[',
boundry_stop => ']',
tokens => [qw( ' ' " " )],
boundry_begin => 0,
boundry_end => 0
);
print Dumper( $el );
Output:
["\@key='val'", "\@key2='val2'"]
Step 3:
Third, parse the elements from step 2 that is a single key/val, the single
key/val is delimited by the = character
my $el = charlexsplit (
string => q{ @key='val' },
boundry_start => '=',
boundry_stop => '=',
tokens => [qw( ' ' " " )],
boundry_begin => 1,
boundry_end => 1
);
print Dumper( $el );
Output:
["\@key", "'val'"]
Note that in each example the C<tokens> represent a group of escaped characters
which, when analyzed, will be collected as part of an element, but will not be
allowed to match any starting or stopping boundry.
So if you have a start token without a stop token, you will get undesired
results. This example demonstrate this data error.
my $el = charlexsplit (
string => q{ path[@key='val'][@key2=val2'] },
boundry_start => '[',
boundry_stop => ']',
tokens => [qw( ' ' " " )],
boundry_begin => 0,
boundry_end => 0
);
print Dumper( $el );
Undesired output:
["\@key='val'"]
In this example of bad data being parsed, the C<boundry_stop> character C<]> was
never matched for the C<key2=val2> element.
And there is no error message. The charlexsplit method throws away the second
element silently due to the token start and stop mismatch.
=head2 Method: parseXMLPath
use XML::TreePP::XMLPath qw(parseXMLPath);
use Data::Dumper;
my $parsedPath = parseXMLPath(
q{abcdefg/xyz/path[@key1='val1'][key2='val2']/last}
);
print Dumper ( $parsedPath );
Output:
[
["abcdefg", undef],
["xyz", undef],
["path", [["-key1", "val1"], ["key2", "val2"]]],
["last", undef],
]
=head2 Method: filterXMLDoc
Filtering an XML Document, using an XMLPath, to find a node within the
document.
#!/usr/bin/perl
use XML::TreePP;
use XML::TreePP::XMLPath qw(filterXMLDoc);
use Data::Dumper;
#
# The XML document data
my $xmldata=<<XMLEND;
<level1>
<level2>
<level3 attr1="val1" attr2="val2">
<attr3>val3</attr3>
<attr4/>
<attrX>one</attrX>
<attrX>two</attrX>
<attrX>three</attrX>
</level3>
<level3 attr1="valOne"/>
</level2>
</level1>
XMLEND
#
# Parse the XML document.
my $tpp = new XML::TreePP;
my $xmldoc = $tpp->parse($xmldata);
print "Output Test #1\n";
print Dumper( $xmldoc );
#
# Retrieve the sub tree of the XML document at path "level1/level2"
my $xmlSubTree = filterXMLDoc($xmldoc, 'level1/level2');
print "Output Test #2\n";
print Dumper( $xmlSubTree );
#
# Retrieve the sub tree of the XML document at path "level1/level2/level3[@attr1='val1']"
my $xmlSubTree = filterXMLDoc($xmldoc, 'level1/level2/level3[@attr1="val1"]');
( run in 0.515 second using v1.01-cache-2.11-cpan-71847e10f99 )