home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2004 December / PCpro_2004_12.ISO / files / webserver / tsw / TSW_3.4.0.exe / Apache2 / perl / Generator.pm < prev    next >
Encoding:
Perl POD Document  |  2003-08-19  |  3.6 KB  |  144 lines

  1. # $Id: Generator.pm,v 1.4 2003/08/19 21:06:32 phish Exp $
  2.  
  3. package XML::LibXML::SAX::Generator;
  4.  
  5. use strict;
  6.  
  7. use XML::LibXML;
  8.  
  9. warn("This class (", __PACKAGE__, ") is deprecated!");
  10.  
  11. sub new {
  12.     my $class = shift;
  13.     unshift @_, 'Handler' unless @_ != 1;
  14.     my %p = @_;
  15.     return bless \%p, $class;
  16. }
  17.  
  18. sub generate {
  19.     my $self = shift;
  20.     my ($node) = @_;
  21.     
  22.     my $document = { Parent => undef };
  23.     $self->{Handler}->start_document($document);
  24.     
  25.     process_node($self->{Handler}, $node);
  26.     
  27.     $self->{Handler}->end_document($document);
  28. }
  29.  
  30. sub process_node {
  31.     my ($handler, $node) = @_;
  32.     
  33.     my $node_type = $node->getType();
  34.     if ($node_type == XML_COMMENT_NODE) {
  35.         $handler->comment( { Data => $node->getData } );
  36.     }
  37.     elsif ($node_type == XML_TEXT_NODE || $node_type == XML_CDATA_SECTION_NODE) {
  38.         # warn($node->getData . "\n");
  39.         $handler->characters( { Data => $node->getData } );
  40.     }
  41.     elsif ($node_type == XML_ELEMENT_NODE) {
  42.         # warn("<" . $node->getName . ">\n");
  43.         process_element($handler, $node);
  44.         # warn("</" . $node->getName . ">\n");
  45.     }
  46.     elsif ($node_type == XML_ENTITY_REF_NODE) {
  47.         foreach my $kid ($node->getChildnodes) {
  48.             # warn("child of entity ref: " . $kid->getType() . " called: " . $kid->getName . "\n");
  49.             process_node($handler, $kid);
  50.         }
  51.     }
  52.     elsif ($node_type == XML_DOCUMENT_NODE) {
  53.         # just get root element. Ignore other cruft.
  54.         foreach my $kid ($node->getChildnodes) {
  55.             if ($kid->getType() == XML_ELEMENT_NODE) {
  56.                 process_element($handler, $kid);
  57.                 last;
  58.             }
  59.         }
  60.     }
  61.     else {
  62.         warn("unknown node type: $node_type");
  63.     }
  64. }
  65.  
  66. sub process_element {
  67.     my ($handler, $element) = @_;
  68.     
  69.     my @attr;
  70.     
  71.     foreach my $attr ($element->getAttributes) {
  72.         push @attr, XML::LibXML::SAX::AttributeNode->new(
  73.             Name => $attr->getName,
  74.             Value => $attr->getData,
  75.             NamespaceURI => $attr->getNamespaceURI,
  76.             Prefix => $attr->getPrefix,
  77.             LocalName => $attr->getLocalName,
  78.             );
  79.     }
  80.     
  81.     my $node = {
  82.         Name => $element->getName,
  83.         Attributes => { map { $_->{Name} => $_ } @attr },
  84.         NamespaceURI => $element->getNamespaceURI,
  85.         Prefix => $element->getPrefix,
  86.         LocalName => $element->getLocalName,
  87.     };
  88.     
  89.     $handler->start_element($node);
  90.     
  91.     foreach my $child ($element->getChildnodes) {
  92.         process_node($handler, $child);
  93.     }
  94.     
  95.     $handler->end_element($node);
  96. }
  97.  
  98. package XML::LibXML::SAX::AttributeNode;
  99.  
  100. use overload '""' => "stringify";
  101.  
  102. sub new {
  103.     my $class = shift;
  104.     my %p = @_;
  105.     return bless \%p, $class;
  106. }
  107.  
  108. sub stringify {
  109.     my $self = shift;
  110.     return $self->{Value};
  111. }
  112.  
  113. 1;
  114.  
  115. __END__
  116.  
  117. =head1 NAME
  118.  
  119. XML::LibXML::SAX::Generator - Generate SAX events from a LibXML tree
  120.  
  121. =head1 SYNOPSIS
  122.  
  123.   my $handler = MySAXHandler->new();
  124.   my $generator = XML::LibXML::SAX::Generator->new(Handler => $handler);
  125.   my $dom = XML::LibXML->new->parse_file("foo.xml");
  126.   
  127.   $generator->generate($dom);
  128.  
  129. =head1 DESCRIPTION
  130.  
  131. THIS CLASS IS DEPRACED! Use XML::LibXML::SAX::Parser instead!
  132.  
  133. This helper class allows you to generate SAX events from any XML::LibXML
  134. node, and all it's sub-nodes. This basically gives you interop from
  135. XML::LibXML to other modules that may implement SAX.
  136.  
  137. It uses SAX2 style, but should be compatible with anything SAX1, by use
  138. of stringification overloading.
  139.  
  140. There is nothing to really know about, beyond the synopsis above, and
  141. a general knowledge of how to use SAX, which is beyond the scope here.
  142.  
  143. =cut
  144.