summaryrefslogtreecommitdiff
path: root/examples/xpath
diff options
context:
space:
mode:
Diffstat (limited to 'examples/xpath')
-rwxr-xr-xexamples/xpath83
1 files changed, 83 insertions, 0 deletions
diff --git a/examples/xpath b/examples/xpath
new file mode 100755
index 0000000..bb7f0fc
--- /dev/null
+++ b/examples/xpath
@@ -0,0 +1,83 @@
+#!/usr/bin/perl -w
+use strict;
+
+$| = 1;
+
+unless (@ARGV >= 1) {
+ print STDERR qq(Usage:
+$0 [filename] query
+
+ If no filename is given, supply XML on STDIN.
+);
+ exit;
+}
+
+use XML::XPath;
+
+my $xpath;
+
+my $pipeline;
+
+if ($ARGV[0] eq '-p') {
+ # pipeline mode
+ $pipeline = 1;
+ shift @ARGV;
+}
+if (@ARGV >= 2) {
+ $xpath = XML::XPath->new(filename => shift(@ARGV));
+}
+else {
+ $xpath = XML::XPath->new(ioref => \*STDIN);
+}
+
+my $nodes = $xpath->find(shift @ARGV);
+
+unless ($nodes->isa('XML::XPath::NodeSet')) {
+NOTNODES:
+ print STDERR "Query didn't return a nodeset. Value: ";
+ print $nodes->value, "\n";
+ exit;
+}
+
+if ($pipeline) {
+ $nodes = find_more($nodes);
+ goto NOTNODES unless $nodes->isa('XML::XPath::NodeSet');
+}
+
+if ($nodes->size) {
+ print STDERR "Found ", $nodes->size, " nodes:\n";
+ foreach my $node ($nodes->get_nodelist) {
+ print STDERR "-- NODE --\n";
+ print $node->toString;
+ }
+}
+else {
+ print STDERR "No nodes found";
+}
+
+print STDERR "\n";
+
+exit;
+
+sub find_more {
+ my ($nodes) = @_;
+ if (!@ARGV) {
+ return $nodes;
+ }
+
+ my $newnodes = XML::XPath::NodeSet->new;
+
+ my $find = shift @ARGV;
+
+ foreach my $node ($nodes->get_nodelist) {
+ my $new = $xpath->find($find, $node);
+ if ($new->isa('XML::XPath::NodeSet')) {
+ $newnodes->append($new);
+ }
+ else {
+ warn "Not a nodeset: ", $new->value, "\n";
+ }
+ }
+
+ return find_more($newnodes);
+}