home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / perl5 / XML / Grove / AsCanonXML.pm next >
Encoding:
Text File  |  1999-10-23  |  3.7 KB  |  179 lines

  1. #
  2. # Copyright (C) 1998, 1999 Ken MacLeod
  3. # XML::Grove::AsCanonXML is free software; you can redistribute it and/or
  4. # modify it under the same terms as Perl itself.
  5. #
  6. # $Id: AsCanonXML.pm,v 1.6 1999/08/17 18:36:20 kmacleod Exp $
  7. #
  8.  
  9. use strict;
  10.  
  11. package XML::Grove::AsCanonXML;
  12. use vars qw{%char_entities};
  13. use Data::Grove::Visitor;
  14.  
  15. %char_entities = (
  16.     "\x09" => ' ',
  17.     "\x0a" => ' ',
  18.     "\x0d" => ' ',
  19.     '&' => '&',
  20.     '<' => '<',
  21.     '>' => '>',
  22.     '"' => '"',
  23. );
  24.  
  25. sub new {
  26.     my $class = shift;
  27.     my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };
  28.  
  29.     return bless $self, $class;
  30. }
  31.  
  32. sub as_canon_xml {
  33.     my $self = shift; my $object = shift; my $fh = shift;
  34.  
  35.     if (defined $fh) {
  36.     return ();
  37.     } else {
  38.     return join('', $object->accept($self, $fh));
  39.     }
  40. }
  41.  
  42. sub visit_document {
  43.     my $self = shift; my $document = shift;
  44.  
  45.     return $document->children_accept($self, @_);
  46. }
  47.  
  48. sub visit_element {
  49.     my $self = shift; my $element = shift; my $fh = shift;
  50.  
  51.     my @return;
  52.     push @return, $self->_print($fh, '<' . $element->{Name});
  53.     my $key;
  54.     my $attrs = $element->{Attributes};
  55.     foreach $key (sort keys %$attrs) {
  56.     push @return, $self->_print($fh,
  57.               " $key=\"" . $self->_escape($attrs->{$key}) . '"');
  58.     }
  59.     push @return, $self->_print($fh, '>');
  60.  
  61.     push @return, $element->children_accept($self, $fh, @_);
  62.  
  63.     push @return, $self->_print($fh, '</' . $element->{Name} . '>');
  64.  
  65.     return @return;
  66. }
  67.  
  68. sub visit_entity {
  69.     # entities don't occur in text
  70.     return ();
  71. }
  72.  
  73. sub visit_pi {
  74.     my $self = shift; my $pi = shift; my $fh = shift;
  75.  
  76.     return $self->_print($fh, '<?' . $pi->{Target} . ' ' . $pi->{Data} . '?>');
  77. }
  78.  
  79. sub visit_comment {
  80.     my $self = shift; my $comment = shift; my $fh = shift;
  81.  
  82.     if ($self->{Comments}) {
  83.     return $self->_print($fh, '<!--' . $comment->{Data} . '-->');
  84.     } else {
  85.     return ();
  86.     }
  87. }
  88.  
  89. sub visit_characters {
  90.     my $self = shift; my $characters = shift; my $fh = shift;
  91.  
  92.     return ($self->_print($fh, $self->_escape($characters->{Data})));
  93. }
  94.  
  95. sub _print {
  96.     my $self = shift; my $fh = shift; my $string = shift;
  97.  
  98.     if (defined $fh) {
  99.     $fh->print($string);
  100.     return ();
  101.     } else {
  102.     return ($string);
  103.     }
  104. }
  105.  
  106. sub _escape {
  107.     my $self = shift; my $string = shift;
  108.  
  109.     $string =~ s/([\x09\x0a\x0d&<>"])/$char_entities{$1}/ge;
  110.     return $string;
  111. }
  112.  
  113. package XML::Grove;
  114.  
  115. sub as_canon_xml {
  116.     my $xml_object = shift;
  117.  
  118.     return XML::Grove::AsCanonXML->new(@_)->as_canon_xml($xml_object);
  119. }
  120.  
  121. 1;
  122.  
  123. __END__
  124.  
  125. =head1 NAME
  126.  
  127. XML::Grove::AsCanonXML - output XML objects in canonical XML
  128.  
  129. =head1 SYNOPSIS
  130.  
  131.  use XML::Grove::AsCanonXML;
  132.  
  133.  # Using as_canon_xml method on XML::Grove objects:
  134.  $string = $xml_object->as_canon_xml( OPTIONS );
  135.  
  136.  # Using an XML::Grove::AsCanonXML instance:
  137.  $writer = XML::Grove::AsCanonXML->new( OPTIONS );
  138.  
  139.  $string = $writer->as_canon_xml($xml_object);
  140.  $writer->as_canon_xml($xml_object, $file_handle);
  141.  
  142. =head1 DESCRIPTION
  143.  
  144. C<XML::Grove::AsCanonXML> will return a string or write a stream of
  145. canonical XML for an XML object and it's content (if any).
  146.  
  147. C<XML::Grove::AsCanonXML> objects hold the options used for writing
  148. the XML objects.  Options can be supplied when the the object is
  149. created,
  150.  
  151.     $writer = XML::Grove::AsCanonXML->new( Comments => 1 );
  152.  
  153. or modified at any time before writing an XML object by setting the
  154. option directly in the `C<$writer>' hash.
  155.  
  156. =head1 OPTIONS
  157.  
  158. =over 4
  159.  
  160. =item Comments
  161.  
  162. By default comments are not written to the output.  Setting comment to
  163. TRUE will include comments in the output.
  164.  
  165. =back
  166.  
  167. =head1 AUTHOR
  168.  
  169. Ken MacLeod, ken@bitsko.slc.ut.us
  170.  
  171. =head1 SEE ALSO
  172.  
  173. perl(1), XML::Parser(3), XML::Grove(3).
  174.  
  175. James Clark's Canonical XML definition
  176. <http://www.jclark.com/xml/canonxml.html>
  177.  
  178. =cut
  179.