1
# $Id: Parser.pm,v 1.1 2001/11/14 10:59:58 matt Exp $
3
package XML::LibXML::SAX::Parser;
6
use vars qw($VERSION @ISA);
12
@ISA = ('XML::SAX::Base');
14
sub _parse_characterstream {
15
my ($self, $fh, $options) = @_;
16
die "parsing a characterstream is not supported at this time";
19
sub _parse_bytestream {
20
my ($self, $fh, $options) = @_;
21
my $parser = XML::LibXML->new();
22
my $doc = $parser->parse_fh($fh);
23
$self->generate($doc);
27
my ($self, $str, $options) = @_;
28
my $parser = XML::LibXML->new();
29
my $doc = $parser->parse_string($str);
30
$self->generate($doc);
34
my ($self, $sysid, $options) = @_;
35
my $parser = XML::LibXML->new();
36
my $doc = $parser->parse_file($sysid);
37
$self->generate($doc);
44
$self->start_document({});
46
$self->process_node($node);
48
$self->end_document({});
52
my ($self, $node) = @_;
54
my $node_type = $node->getType();
55
if ($node_type == XML_COMMENT_NODE) {
56
$self->comment( { Data => $node->getData } );
58
elsif ($node_type == XML_TEXT_NODE || $node_type == XML_CDATA_SECTION_NODE) {
59
# warn($node->getData . "\n");
60
$self->characters( { Data => $node->getData } );
62
elsif ($node_type == XML_ELEMENT_NODE) {
63
# warn("<" . $node->getName . ">\n");
64
$self->process_element($node);
65
# warn("</" . $node->getName . ">\n");
67
elsif ($node_type == XML_ENTITY_REF_NODE) {
68
foreach my $kid ($node->getChildnodes) {
69
# warn("child of entity ref: " . $kid->getType() . " called: " . $kid->getName . "\n");
70
$self->process_node($kid);
73
elsif ($node_type == XML_DOCUMENT_NODE) {
74
# just get root element. Ignore other cruft.
75
foreach my $kid ($node->getChildnodes) {
76
if ($kid->getType() == XML_ELEMENT_NODE) {
77
$self->process_element($kid);
83
warn("unsupported node type: $node_type");
88
my ($self, $element) = @_;
92
foreach my $attr ($element->getAttributes) {
94
if (my $ns = $attr->getNamespaceURI) {
95
$key = "{$ns}".$attr->getLocalName;
98
$key = $attr->getLocalName;
102
Name => $attr->getName,
103
Value => $attr->getData,
104
NamespaceURI => $attr->getNamespaceURI,
105
Prefix => $attr->getPrefix,
106
LocalName => $attr->getLocalName,
111
Name => $element->getName,
112
Attributes => $attribs,
113
NamespaceURI => $element->getNamespaceURI,
114
Prefix => $element->getPrefix,
115
LocalName => $element->getLocalName,
118
$self->start_element($node);
120
foreach my $child ($element->getChildnodes) {
121
$self->process_node($child);
124
$self->end_element($node);
133
XML::LibXML::SAX::Parser - LibXML DOM based SAX Parser
137
my $handler = MySAXHandler->new();
138
my $parser = XML::LibXML::SAX::Parser->new(Handler => $handler);
139
$parser->parse_uri("foo.xml");
143
This class allows you to generate SAX2 events using LibXML. Note
144
that this is B<not> a stream based parser, instead it parses
145
documents into a DOM and traverses the DOM tree. The reason being
146
that libxml2's stream based parsing is extremely primitive,
147
and would require an extreme amount of work to allow SAX2
148
parsing in a stream manner.
152
The API is exactly the same as any other Perl SAX2 parser. See
153
L<XML::SAX::Intro> for details.
155
Aside from the regular parsing methods, you can access the
156
DOM tree traverser directly, using the generate() method:
158
my $parser = XML::LibXML::SAX::Parser->new(...);
159
$parser->generate($dom_tree);
161
This is useful for serializing DOM trees, for example that
162
you might have done prior processing on, or that you have
163
as a result of XSLT processing.