1 # $Id: Reader.pm,v 1.1.2.1 2004/04/20 20:09:48 pajas Exp $
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
9 package XML::LibXML::Reader;
16 use vars qw ($VERSION);
17 $VERSION = "1.70"; # VERSION TEMPLATE: DO NOT CHANGE
22 UNIVERSAL::can('XML::LibXML::Reader','_newForFile') or
23 croak("Cannot use XML::LibXML::Reader module - ".
24 "your libxml2 is compiled without reader support!");
27 use base qw(Exporter);
29 XML_READER_TYPE_NONE => 0,
30 XML_READER_TYPE_ELEMENT => 1,
31 XML_READER_TYPE_ATTRIBUTE => 2,
32 XML_READER_TYPE_TEXT => 3,
33 XML_READER_TYPE_CDATA => 4,
34 XML_READER_TYPE_ENTITY_REFERENCE => 5,
35 XML_READER_TYPE_ENTITY => 6,
36 XML_READER_TYPE_PROCESSING_INSTRUCTION => 7,
37 XML_READER_TYPE_COMMENT => 8,
38 XML_READER_TYPE_DOCUMENT => 9,
39 XML_READER_TYPE_DOCUMENT_TYPE => 10,
40 XML_READER_TYPE_DOCUMENT_FRAGMENT => 11,
41 XML_READER_TYPE_NOTATION => 12,
42 XML_READER_TYPE_WHITESPACE => 13,
43 XML_READER_TYPE_SIGNIFICANT_WHITESPACE => 14,
44 XML_READER_TYPE_END_ELEMENT => 15,
45 XML_READER_TYPE_END_ENTITY => 16,
46 XML_READER_TYPE_XML_DECLARATION => 17,
48 XML_READER_NONE => -1,
49 XML_READER_START => 0,
50 XML_READER_ELEMENT => 1,
52 XML_READER_EMPTY => 3,
53 XML_READER_BACKTRACK => 4,
57 use vars qw( @EXPORT @EXPORT_OK %EXPORT_TAGS );
67 XML_READER_TYPE_ELEMENT
68 XML_READER_TYPE_ATTRIBUTE
71 XML_READER_TYPE_ENTITY_REFERENCE
72 XML_READER_TYPE_ENTITY
73 XML_READER_TYPE_PROCESSING_INSTRUCTION
74 XML_READER_TYPE_COMMENT
75 XML_READER_TYPE_DOCUMENT
76 XML_READER_TYPE_DOCUMENT_TYPE
77 XML_READER_TYPE_DOCUMENT_FRAGMENT
78 XML_READER_TYPE_NOTATION
79 XML_READER_TYPE_WHITESPACE
80 XML_READER_TYPE_SIGNIFICANT_WHITESPACE
81 XML_READER_TYPE_END_ELEMENT
82 XML_READER_TYPE_END_ENTITY
83 XML_READER_TYPE_XML_DECLARATION
97 @EXPORT = (@{$EXPORT_TAGS{types}},@{$EXPORT_TAGS{states}});
99 $EXPORT_TAGS{all}=\@EXPORT_OK;
104 load_ext_dtd => 1, # load the external subset
105 complete_attributes => 2, # default DTD attributes
106 validation => 3, # validate with the DTD
107 expand_entities => 4, # substitute entities
110 my ($self, $name) = @_;
111 my $prop = $props{$name};
112 return undef unless defined $prop;
113 return $self->_getParserProp($prop);
117 my %args = map { ref($_) eq 'HASH' ? (%$_) : $_ } @_;
119 while (($key,$value) = each %args) {
120 my $prop = $props{ $key };
121 $self->_setParserProp($prop,$value);
126 my (%string_pool,%rng_pool,%xsd_pool); # used to preserve data passed to the reader
129 my %args = map { ref($_) eq 'HASH' ? (%$_) : $_ } @_;
130 my $encoding = $args{encoding};
131 my $URI = $args{URI};
132 $URI="$URI" if defined $URI; # stringify in case it is an URI object
133 my $options = XML::LibXML->_parser_options(\%args);
136 if ( defined $args{location} ) {
137 $self = $class->_newForFile( $args{location}, $encoding, $options );
139 elsif ( defined $args{string} ) {
140 $self = $class->_newForString( $args{string}, $URI, $encoding, $options );
141 $string_pool{$self} = \$args{string};
143 elsif ( defined $args{IO} ) {
144 $self = $class->_newForIO( $args{IO}, $URI, $encoding, $options );
146 elsif ( defined $args{DOM} ) {
147 croak("DOM must be a XML::LibXML::Document node")
148 unless UNIVERSAL::isa($args{DOM}, 'XML::LibXML::Document');
149 $self = $class->_newForDOM( $args{DOM} );
151 elsif ( defined $args{FD} ) {
152 my $fd = fileno($args{FD});
153 $self = $class->_newForFd( $fd, $URI, $encoding, $options );
156 croak("XML::LibXML::Reader->new: specify location, string, IO, DOM, or FD");
158 if ($args{RelaxNG}) {
159 if (ref($args{RelaxNG})) {
160 $rng_pool{$self} = \$args{RelaxNG};
161 $self->_setRelaxNG($args{RelaxNG});
163 $self->_setRelaxNGFile($args{RelaxNG});
167 if (ref($args{Schema})) {
168 $xsd_pool{$self} = \$args{Schema};
169 $self->_setXSD($args{Schema});
171 $self->_setXSDFile($args{Schema});
178 delete $string_pool{$self};
179 delete $rng_pool{$self};
180 delete $xsd_pool{$self};
186 # _close return -1 on failure, 0 on success
187 # perl close returns 0 on failure, 1 on success
188 return $reader->_close == 0 ? 1 : 0;
191 sub preservePattern {
193 my ($pattern,$ns_map)=@_;
194 if (ref($ns_map) eq 'HASH') {
195 # translate prefix=>URL hash to a (URL,prefix) list
196 $reader->_preservePattern($pattern,[reverse %$ns_map]);
198 $reader->_preservePattern(@_);
204 my $path = $reader->_nodePath;
205 $path=~s/\[\d+\]//g; # make /foo[1]/bar[1] just /foo/bar, since
206 # sibling count in the buffered fragment is
207 # basically random and generally misleading