XML-DTD

 view release on metacpan or  search on metacpan

lib/XML/Output.pm  view on Meta::CPAN

  my $str = $cr . $indent . "<$name";
  my ($k, $v, $sv);
  while ( ($k,$v) = each(%$attr) ) {
    if (defined $v) {
      $sv = $self->_cesubst($cnfg, $v);
      $str .= " $k=$attq$sv$attq";
    }
  }
  if (defined $cnfg->{'empty'} and $cnfg->{'empty'} == 1) {
    $str .= '/>';
  } else {
    $str .= '>';
    push @{$self->{'STACK'}}, $name;
  }
  if (defined $fh) {
    print $fh $str;
  } else {
    $self->{'STRACCUM'} .= $str;
  }
}


# Print an element end tag
sub close {
  my $self = shift;

  my $indent = ' ' x ((@{$self->{'STACK'}}-1) * $self->{'INDENT'});
  $indent = '' if ($self->{'PCDATA'} == 1);
  my $cr = ($self->{'PCDATA'} == 1)?'':"\n";
  my $name = pop @{$self->{'STACK'}};
  my $fh = $self->{'FH'};
  ##print $fh $cr . $indent . "</$name>";
  my $str = $cr . $indent . "</$name>";
  $self->{'PCDATA'} = 0;
  ##print $fh "\n" if (@{$self->{'STACK'}} == 0);
  $str .= "\n" if (@{$self->{'STACK'}} == 0);
  if (defined $fh) {
    print $fh $str;
  } else {
    $self->{'STRACCUM'} .= $str;
  }
}


# Print an empty tag
sub empty {
  my $self = shift;
  my $name = shift;
  my $attr = shift;
  my $cnfg = shift;

  my $ecnfg = (defined $cnfg)?{ %$cnfg }:{};
  $ecnfg->{'empty'} = 1;
  $self->open($name, $attr, $ecnfg);
  ##$self->{'PCDATA'} = 1;
  ##$self->close();
}


# Print #PCDATA
sub pcdata {
  my $self = shift;
  my $data = shift;
  my $cnfg = shift;

  $self->{'PCDATA'} = 1;
  my $fh = $self->{'FH'};
  my $str = $self->_cesubst($cnfg, $data);
  if (defined $fh) {
    print $fh $str;
  } else {
    $self->{'STRACCUM'} .= $str;
  }
}


# Print a comment
sub comment {
  my $self = shift;
  my $cmnt = shift;
  my $cnfg = shift;

  my $cr = ($self->{'INIT'} == 1)?'':"\n";
  $self->{'INIT'} = 0;
  my $str = "$cr<!-- $cmnt -->";
  my $fh = $self->{'FH'};
  if (defined $fh) {
    print $fh $str;
  } else {
    $self->{'STRACCUM'} .= $str;
  }
}


# Get the string accumlator value
sub xmlstr {
  my $self = shift;

  return $self->{'STRACCUM'};
}

# Substitute special characters with corresponding character entities
sub _cesubst {
  my $self = shift;
  my $cnfg = shift;
  my $text = shift;

  my $ssubst = { %{$self->{'SUBST'}} };
  my $csubst = (defined $cnfg->{'subst'})?$cnfg->{'subst'}:{};
  # Construct hash merging standard and user-defined substitutions
  my ($k,$v);
  while ( ($k,$v) = each(%$csubst) ) {
    $ssubst->{$k} = $v;
  }
  # Perform all substitutions
  while ( ($k,$v) = each(%$ssubst) ) {
    $text =~ s/$k/$v/gs;
  }
  #NB: Still need to take care of '&' not part of an entity ref
  return $text;
}


1;
__END__

=head1 NAME

XML::Output - Perl module for writing simple XML documents

=head1 SYNOPSIS

  use XML::Output;

  open(FH,'>file.xml');
  my $xo = new XML::Output({'fh' => *FH});
  $xo->open('tagname', {'attrname' => 'attrval'});
  $xo->pcdata('element content');
  $xo->close();
  close(FH);

=head1 ABSTRACT

  XML::Output is a Perl module for writing simple XML documents

=head1 DESCRIPTION

  XML::Output is a Perl module for writing simple XML document. The
  following methods are provided.

=over 4

=item B<new>

  $xo = new XML::Output;

Constructs a new XML::Output object.

=item B<open>

  $xo->open('tagname', {'attrname' => 'attrval'});

Open an element with specified name (and optional attributes)

=item B<close>

 $xo->close;

Close an element

=item B<empty>

 $xo->empty('tagname', {'attrname' => 'attrval'});

Insert an empty element with specified name (and optional attributes)

=item B<pcdata>

 $xo->pcdata('element content');

Insert text

=item B<comment>

 $xo->comment('comment text');

Insert a comment

=item B<xmlstr>

 print $xo->xmlstr;

Get a string representation of the constructed document

=back


=head1 SEE ALSO

L<XML::DTD>

=head1 AUTHOR

Brendt Wohlberg E<lt>wohl@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2004-2010 by Brendt Wohlberg

This library is available under the terms of the GNU General Public
License (GPL), described in the GPL file included in this distribution.

=cut



( run in 0.574 second using v1.01-cache-2.11-cpan-39bf76dae61 )