package XML::GDOME::SAX::Builder; use XML::GDOME; sub new { my $class = shift; return bless {}, $class; } sub start_document { my ($self, $doc) = @_; $self->{Parent} = undef; } sub end_document { my ($self, $doc) = @_; my $dom = delete $self->{DOM}; delete $self->{Parent}; return $dom; } sub start_element { my ($self, $el) = @_; my $node; unless ($self->{DOM}) { $self->{DOM} = XML::GDOME->createDocument($el->{NamespaceURI}, $el->{Name}, undef); $node = $self->{DOM}->getDocumentElement; } else { if ($el->{NamespaceURI}) { $node = $self->{DOM}->createElementNS($el->{NamespaceURI}, $el->{Name}); } else { $node = $self->{DOM}->createElement($el->{Name}); } } # do attributes foreach my $key (keys %{$el->{Attributes}}) { my $attr = $el->{Attributes}->{$key}; if (ref($attr)) { # SAX2 attributes if ($attr->{NamespaceURI}) { $node->setAttributeNS($attr->{NamespaceURI}, $attr->{Name} => $attr->{Value}); } else { $node->setAttribute($key => $attr->{Value}); } } else { $node->setAttribute($key => $attr); } } # append if ($self->{Parent}) { $self->{Parent}->appendChild($node); $self->{Parent} = $node; } else { $self->{Parent} = $node; } } sub end_element { my ($self, $el) = @_; return unless $self->{Parent}; $self->{Parent} = $self->{Parent}->getParentNode(); } sub characters { my ($self, $chars) = @_; return unless $self->{Parent}; $self->{Parent}->appendText($chars->{Data}); } 1; __END__ =head1 NAME XML::GDOME::SAX::Builder - build a GDOME tree from SAX events =head1 SYNOPSIS my $builder = XML::GDOME::SAX::Builder->new(); my $gen = XML::Generator::DBI->new(Handler => $builder, dbh => $dbh); my $dom = $gen->execute("SELECT * FROM Users"); =head1 DESCRIPTION This is a SAX handler that generates a DOM tree from SAX events. Usage is as above. Input is accepted from any SAX1 or SAX2 event generator. =cut