1 # $Id: Generator.pm 772 2009-01-23 21:42:09Z pajas
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::Generator;
15 use vars qw ($VERSION);
17 $VERSION = "1.70"; # VERSION TEMPLATE: DO NOT CHANGE
20 return $XML::LibXML::__threads_shared ? 0 : 1;
23 warn("This class (", __PACKAGE__, ") is deprecated!");
27 unshift @_, 'Handler' unless @_ != 1;
29 return bless \%p, $class;
36 my $document = { Parent => undef };
37 $self->{Handler}->start_document($document);
39 process_node($self->{Handler}, $node);
41 $self->{Handler}->end_document($document);
45 my ($handler, $node) = @_;
47 my $node_type = $node->getType();
48 if ($node_type == XML_COMMENT_NODE) {
49 $handler->comment( { Data => $node->getData } );
51 elsif ($node_type == XML_TEXT_NODE || $node_type == XML_CDATA_SECTION_NODE) {
52 # warn($node->getData . "\n");
53 $handler->characters( { Data => $node->getData } );
55 elsif ($node_type == XML_ELEMENT_NODE) {
56 # warn("<" . $node->getName . ">\n");
57 process_element($handler, $node);
58 # warn("</" . $node->getName . ">\n");
60 elsif ($node_type == XML_ENTITY_REF_NODE) {
61 foreach my $kid ($node->getChildnodes) {
62 # warn("child of entity ref: " . $kid->getType() . " called: " . $kid->getName . "\n");
63 process_node($handler, $kid);
66 elsif ($node_type == XML_DOCUMENT_NODE) {
67 # just get root element. Ignore other cruft.
68 foreach my $kid ($node->getChildnodes) {
69 if ($kid->getType() == XML_ELEMENT_NODE) {
70 process_element($handler, $kid);
76 warn("unknown node type: $node_type");
81 my ($handler, $element) = @_;
85 foreach my $attr ($element->getAttributes) {
86 push @attr, XML::LibXML::SAX::AttributeNode->new(
87 Name => $attr->getName,
88 Value => $attr->getData,
89 NamespaceURI => $attr->getNamespaceURI,
90 Prefix => $attr->getPrefix,
91 LocalName => $attr->getLocalName,
96 Name => $element->getName,
97 Attributes => { map { $_->{Name} => $_ } @attr },
98 NamespaceURI => $element->getNamespaceURI,
99 Prefix => $element->getPrefix,
100 LocalName => $element->getLocalName,
103 $handler->start_element($node);
105 foreach my $child ($element->getChildnodes) {
106 process_node($handler, $child);
109 $handler->end_element($node);
112 package XML::LibXML::SAX::AttributeNode;
114 use overload '""' => "stringify";
119 return bless \%p, $class;
124 return $self->{Value};
133 XML::LibXML::SAX::Generator - Generate SAX events from a LibXML tree
137 my $handler = MySAXHandler->new();
138 my $generator = XML::LibXML::SAX::Generator->new(Handler => $handler);
139 my $dom = XML::LibXML->new->parse_file("foo.xml");
141 $generator->generate($dom);
145 THIS CLASS IS DEPRACED! Use XML::LibXML::SAX::Parser instead!
147 This helper class allows you to generate SAX events from any XML::LibXML
148 node, and all it's sub-nodes. This basically gives you interop from
149 XML::LibXML to other modules that may implement SAX.
151 It uses SAX2 style, but should be compatible with anything SAX1, by use
152 of stringification overloading.
154 There is nothing to really know about, beyond the synopsis above, and
155 a general knowledge of how to use SAX, which is beyond the scope here.