4 # SAX version of XML::Template. Advantages over DOM: Doesn't have to load
5 # the entire thing into memory, and you can chain filters. Disadvantages:
6 # Slightly kludgier interface, and you won't get a DOM tree out.
8 # Differences from the DOM version:
10 # - There is no process(). Instead, it works as a SAX filter, so you put it
11 # in the stream, usually between a parser and a writer (ie.
12 # parser -> XML::TemplateSAX::Handler -> writer). process_file works as
13 # before, but it returns a _string_, not a DOM tree.
14 # - You can no longer insert a DOM tree, naturally. Instead, you can set up
15 # an XML::TemplateSAX::Buffer, let it gobble up your data, and send it
16 # in the way you'd insert a DOM tree. process_file_to_buffer does this
17 # transparently for you, returning a buffer you can give in.
24 use XML::TemplateSAX::Buffer;
25 use XML::TemplateSAX::Cleaner;
26 use XML::TemplateSAX::Handler;
28 package XML::TemplateSAX;
31 my ($filename, $obj, $clean) = @_;
32 $clean = 1 unless (defined($clean));
34 my ($writer, $cleaner, $filter, $parser);
37 $writer = XML::SAX::Writer->new(Output => \$str);
40 $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $writer);
41 $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj);
43 $filter = XML::TemplateSAX::Handler->new(Handler => $writer, Content => $obj);
46 # FIXME: hardcoding expat = not good?
47 $parser = XML::SAX::Expat->new(Handler => $filter);
48 $parser->parse_file($filename);
53 sub process_file_to_buffer {
54 my ($filename, $obj, $clean) = @_;
55 $clean = 1 unless (defined($clean));
57 my ($buffer, $cleaner, $filter, $parser);
59 $buffer = XML::TemplateSAX::Buffer->new;
62 $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $buffer);
63 $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj);
65 $filter = XML::TemplateSAX::Handler->new(Handler => $buffer, Content => $obj);
68 # FIXME: hardcoding expat = not good?
69 $parser = XML::SAX::Expat->new(Handler => $filter);
70 $parser->parse_file($filename);
76 my ($tag, $array, @elems) = @_;
79 my $num = scalar @elems;
81 for my $ref (@$array) {
83 $ref->{$tag} = $elems[$i++ % $num];