Subject: | Adding XML::SAX::DocumentLocator support to XML::LibXML::SAX::Parser |
The XML::LibXML::SAX::Parser module doesn't really support
XML::SAX::DocumentLocator. The attached patch is my stab at adding that
support. If it looks good, I hope that it will be considered for
inclusion in XML::LibXML. Thanks!
--
David Hull
Subject: | Parser.pm.diff |
--- lib/XML/LibXML/SAX/Parser.pm.orig 2007-08-20 16:25:04.000000000 -0700
+++ lib/XML/LibXML/SAX/Parser.pm 2007-08-20 16:26:31.000000000 -0700
@@ -43,6 +43,21 @@
my $self = shift;
my ($node) = @_;
+ $self->{node_stack} = [];
+ my $doc = $node->ownerDocument();
+ my $dtd = defined $doc ? $doc->externalSubset() : undef;
+
+ $self->set_document_locator(
+ XML::SAX::DocumentLocator->new(
+ sub { defined $dtd ? $dtd->publicId() : undef },
+ sub { defined $dtd ? $dtd->systemId() : undef },
+ sub { $self->{node_stack}->[$#{$self->{node_stack}}]->line_number() },
+ sub { 1 },
+ sub { defined $doc ? $doc->encoding() : undef },
+ sub { defined $doc ? $doc->version() : undef},
+ ),
+ );
+
if ( $node->nodeType() == XML_DOCUMENT_NODE
|| $node->nodeType == XML_HTML_DOCUMENT_NODE ) {
$self->start_document({});
@@ -55,6 +70,8 @@
sub process_node {
my ($self, $node) = @_;
+ push(@{$self->{node_stack}}, $node);
+
my $node_type = $node->nodeType();
if ($node_type == XML_COMMENT_NODE) {
$self->comment( { Data => $node->getData } );
@@ -102,6 +119,8 @@
else {
# warn("unsupported node type: $node_type");
}
+
+ pop(@{$self->{node_stack}});
}
sub process_element {