Seeking peer review of new fast high level XML pull parser

Tyler Riddle <[email protected]>
Newsgroups gmane.comp.lang.perl.xml
Message-ID <[email protected]>
Hi XML folks,

I'm putting the finishing touches on XML::TreePuller which is a high
level very fast XML pull processor but I'd like to solicit the
feedback of the public before I publish the first version onto CPAN.
It is functional and almost ready for a release so feel free to test
it if you would like. I would appreciate any feedback people have
especially on the
documentation and interface - I'm aiming to be understandable at a
glance and easy to use.

You can see the code for the module at
https://triddle.projecthut.com/svn/triddle/XML-TreePuller/lib/XML/TreePuller.pm
and there is a real-world example of the same interface (with an
insignificant change) in use in MediaWiki::DumpFile::Pages at
http://cpansearch.perl.org/src/TRIDDLE/MediaWiki-DumpFile-0.0.14/lib/MediaWiki/DumpFile/Pages.pm
(XML::TreePuller and MediaWiki::DumpFile::XML have a nearly identical
interface).

How fast is it? In my benchmarks
(https://triddle.projecthut.com/svn/triddle/XML_Speed_Test/test_cases/)
it performs as follows:

---
- filename: datastore/20-simplewiki-20091021-pages-articles.xml
  markup_density: 0.202659609191331
  md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
  size: 227681797
  tests:
    - MiB/sec: 25.6054577962408
      md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
      name: test/XML-LibXML-Reader.t
      percentage: 100
      runtimes:
        system: 0.74
        total: 8.48
        user: 7.74
    - MiB/sec: 12.450360212851
      md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
      name: test/XML-TreePuller_element.t
      percentage: 205
      runtimes:
        system: 0.51
        total: 17.44
        user: 16.93
    - MiB/sec: 9.98318538446536
      md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
      name: test/XML-TreePuller_config.t
      percentage: 256
      runtimes:
        system: 0.54
        total: 21.75
        user: 21.21
    - MiB/sec: 6.67489339416298
      md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
      name: test/XML-SAX-ExpatXS.t
      percentage: 383
      runtimes:
        system: 0.41
        total: 32.53
        user: 32.12
    - MiB/sec: 5.03441414588735
      md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
      name: test/XML-Parser.t
      percentage: 508
      runtimes:
        system: 0.71
        total: 43.13
        user: 42.42
    - MiB/sec: 3.21537512382825
      md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
      name: test/XML-LibXML-SAX.t
      percentage: 796
      runtimes:
        system: 0.82
        total: 67.53
        user: 66.71
    - MiB/sec: 1.06375799584618
      md5sum: 8fa1e9de18b8da7523ebfe2dac53482a
      name: test/XML-Twig.t
      percentage: 2407
      runtimes:
        system: 1.73
        total: 204.12
        user: 202.39

Also here is an example just for good measure:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::TreePuller;

sub gen_xml {
  	return <<EOF
  	
<wiki version="0.3">

<!-- schema says that there is always 1 siteinfo and zero or more page
  elements follow -->
<siteinfo>
  <sitename>ExamplePedia</sitename>
  <url>http://example.pedia/</url>
  <namespaces>
    <namespace key="-1">Special</namespace>
    <namespace key="0" />
    <namespace key="1">Talk</namespace>
  </namespaces>
</siteinfo>

<page>
  <title>A good article</title>
  <text>Some good content</text>
</page>

<page>
  <title>A bad article</title>
  <text>Some bad content</text>
</page>

</wiki>
  	  	
EOF
}

sub element_example {
	my $xml = XML::TreePuller->new(string => gen_xml());
	
	print "Printing namespace names using configuration style:\n";
	
	$xml->config('/wiki/siteinfo/namespaces/namespace' => 'short');
	
	while(defined(my $element = $xml->next)) {
		print $element->attribute('key'), ": ", $element->text, "\n";
	}
	
	print "End of namespace names\n";
}

sub subtree_example {
	my $xml = XML::TreePuller->new(string => gen_xml());
	
	print "Printing titles using a subtree:\n";
	
	$xml->config('/wiki/page' => 'subtree');

	while(defined(my $element = $xml->next)) {
		print "Title: ", $element->get_elements('title')->text, "\n";
	}	
	
	print "End of titles\n";
}

sub path_example {
	my $xml = XML::TreePuller->new(string => gen_xml());
	
	print "Printing path example:\n";
	
	$xml->config('/wiki/siteinfo', 'subtree');
	$xml->config('/wiki/page/title', 'short');
	
	while(my ($matched_path, $element) = $xml->next) {
		print "Path: $matched_path\n";
	}
	
	print "End path example\n";
}


element_example(); print "\n";
subtree_example(); print "\n";
path_example(); print "\n";

__END__

Output:

Printing namespace names using configuration style:
-1: Special
0:
1: Talk
End of namespace names

Printing titles using a subtree:
Title: A good article
Title: A bad article
End of titles

Printing path example:
Path: /wiki/siteinfo
Path: /wiki/page/title
Path: /wiki/page/title
End path example









Thanks everyone and I'm looking forward to seeing any feedback!

Tyler Riddle

-- 
If you wish to make an apple pie from scratch you must first invent
the universe. -- Carl Sagan
_______________________________________________
Perl-XML mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.