3 # This is free software, you may use it and distribute it under the same terms as
6 # Copyright 2001-2003 AxKit.com Ltd., 2002-2006 Christian Glahn, 2006-2009 Petr Pajas
10 package XML::LibXML::SAX;
15 use vars qw($VERSION @ISA);
17 $VERSION = "2.0207"; # VERSION TEMPLATE: DO NOT CHANGE
22 use parent qw(XML::SAX::Base);
28 return $XML::LibXML::__threads_shared ? 0 : 1;
32 my ($self, $feat, $val) = @_;
34 if ($feat eq 'http://xmlns.perl.org/sax/join-character-data') {
35 $self->{JOIN_CHARACTERS} = $val;
40 return $self->SUPER::set_feature(@_);
43 sub _parse_characterstream {
44 my ( $self, $fh ) = @_;
45 # this my catch the xml decl, so the parser won't get confused about
46 # a possibly wrong encoding.
47 croak( "not implemented yet" );
51 # https://rt.cpan.org/Public/Bug/Display.html?id=132759
52 sub _calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc
54 return XML::LibXML->new( expand_entities => 1, );
57 sub _parse_bytestream {
58 my ( $self, $fh ) = @_;
59 $self->{ParserOptions}{LibParser} = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
60 $self->{ParserOptions}{ParseFunc} = \&XML::LibXML::parse_fh;
61 $self->{ParserOptions}{ParseFuncParam} = $fh;
63 return $self->end_document({});
67 my ( $self, $string ) = @_;
68 $self->{ParserOptions}{LibParser} = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
69 $self->{ParserOptions}{ParseFunc} = \&XML::LibXML::parse_string;
70 $self->{ParserOptions}{ParseFuncParam} = $string;
72 return $self->end_document({});
77 $self->{ParserOptions}{LibParser} = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
78 $self->{ParserOptions}{ParseFunc} = \&XML::LibXML::parse_file;
79 $self->{ParserOptions}{ParseFuncParam} = shift;
81 return $self->end_document({});
85 my ( $self, $chunk ) = @_;
86 $self->{ParserOptions}{LibParser} = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
87 $self->{ParserOptions}{ParseFunc} = \&XML::LibXML::parse_xml_chunk;
88 $self->{ParserOptions}{LibParser}->{IS_FILTER}=1; # a hack to prevent parse_xml_chunk from issuing end_document
89 $self->{ParserOptions}{ParseFuncParam} = $chunk;
96 my $args = bless $self->{ParserOptions}, ref($self);
98 if (defined($self->{JOIN_CHARACTERS})) {
99 $args->{LibParser}->{JOIN_CHARACTERS} = $self->{JOIN_CHARACTERS};
101 $args->{LibParser}->{JOIN_CHARACTERS} = 0;
104 $args->{LibParser}->set_handler( $self );
106 $args->{ParseFunc}->($args->{LibParser}, $args->{ParseFuncParam});
109 if ( $args->{LibParser}->{SAX}->{State} == 1 ) {
110 croak( "SAX Exception not implemented, yet; Data ended before document ended\n" );
113 # break a possible circular reference
114 $args->{LibParser}->set_handler( undef );