Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

CGI::ToXML

by Masem (Monsignor)
on Feb 03, 2002 at 17:17 UTC ( #143079=sourcecode: print w/ replies, xml ) Need Help??

Category: XML Utilities
Author/Contact Info Michael K. Neylon (mneylon-pm@masemware.com)
Description: This module converts CGI objects to an XML structure. While there is CGI::XML out there, the job it does isn't really great in light of newer additions to the XML family. The XML that this produces (see the pod for example), IMO, is more usable for, say, getting the CGI used to generate a page during a XSLT transformation that what CGI::XML offered. C&C is appriciated on this as well as additional functionality that might be wanted.

#!/usr/bin/perl -w
package CGI::ToXML;

#=====================================================================
+========
#
# $Id: ToXML.pm,v 0.01 2002/02/03 17:11:44 mneylon Exp $
# $Revision: 0.01 $
# $Author: mneylon $
# $Date: 2002/02/03 17:11:44 $
# $Log: ToXML.pm,v $
# Revision 0.01  2002/02/03 17:11:44  mneylon
# Initial release to Perlmonks
#
#
#=====================================================================
+========

use strict;
use XML::Simple;

BEGIN {
  use Exporter   ();
  use vars       qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  $VERSION     = sprintf( "%d.%02d", q( $Revision: 0.01 $ ) =~ /\s(\d+
+)\.(\d+)/ );
  @ISA         = qw(Exporter);
  @EXPORT      = qw();
  @EXPORT_OK   = qw( CGItoXML );
  %EXPORT_TAGS = (  );
}

sub CGItoXML {
  my ( $cgi, %options ) = @_;
  if ( ! $cgi->isa( "CGI" ) ) {
    warn "CGItoXML: Object isn't a CGI object, cannot convert";
    return undef;
  }

  # Determine which parameters we keep or not
  my @paramlist = $cgi->param;

  # Exclude what we can first...
  if ( exists $options{ exclude } ) {
    my %exclude_hash; $exclude_hash{ $_ }++ foreach @{ $options{ exclu
+de } };
    @paramlist = grep { !exists( $exclude_hash{ $_ } ) } @paramlist;
  }

  # Include what we can...
  if ( exists $options{ include } ) {
    my %include_hash; $include_hash{ $_ }++ foreach @{ $options{ inclu
+de } };
    @paramlist = grep { exists( $include_hash{ $_ } ) } @paramlist;
  }

  # Set up the hashes to be used for conversion

  my @params;
  foreach my $param ( @paramlist ) {
    my @values;
    # Ensure we get values as an array
    foreach my $value ( $cgi->param( $param ) ) {
      push @values, $value;
    }
    push @params, { parameter => { name => $param,
                   value => \@values } };
  }

  my %cgi_hash = ( cgi => {
               generator => "CGI::toXML",
               version => $VERSION,
               parameter => \@params } );

  return XMLout( \%cgi_hash, rootname => undef ) ;
}


1;
__END__
# Below is stub documentation for your module. You better edit it!

=head1 NAME

CGI::ToXML - Converts CGI to an XML structure

=head1 SYNOPSIS

  use CGI::ToXML qw( CGItoXML );
  use CGI;

  my $q = new CGI;
  my $xml = CGItoXML( $q );
  my $xml2 = CGItoXML( $q, exclude => [ password username sessionid ] 
+);

=head1 DESCRIPTION

Converts a CGI variable (from CGI.pm) to an XML data structure.  While
+ 
there is currently a similar module, CGI::XML, by Jonathan Eisenzopf,
the outputted XML is not in a very usable format, given the newer adva
+nces
in XML (such as XSLT, XPath, etc).  CGI::ToXML aims to correct this by
providing a cleaner XML structure that will be more useful.  The XML i
+s
generated from XML::Simple, keeping this a 'lightweight' function.

The module consists of a single function:

  $xml = CGItoXML( $cgi, %options )

$cgi must be a valid CGI.pm object, and if not, a warning will be issu
+ed
and the function will return undef.  Otherwise, the function will retu
+rn
the XML as a string.  The XML structure will be similar to the followi
+ng:

  <cgi version="0.01" generator="CGI::toXML">
    <parameter name="dinosaur">
      <value>barney</value>
      <value>godzilla</value>
    </parameter>
    <parameter name="color">
      <value>purple</value>
    </parameter>
  </cgi>

as generated from the query string:

  "dinosaur=barney&dinosaur=godzilla&color=purple"

The order of parameters and multivalued entries, as returned by CGI, i
+s
maintained in the XML.

The options hash can be used to customize the behavior a bit more:

=over 4

=item include => [ list ]

Only include the parameters and their values specified in the given li
+st;
all other parameters are not included.  Note that this does not affect
+ the
CGI object storage.

=item exclude => [ list ]

Do not include the parameters and their values specified in the given 
+list; 
all other parameters are included.  Note that this does not affect the
CGI object storage.

=back

=head1 EXPORT

No functions are exported by default, but CGItoXML can be exported by
the user.

=head1 AUTHOR

Michael K. Neylon, E<lt>mneylon-pm@masemware.comE<gt>

=head1 SEE ALSO

L<perl>, L<CGI::XML>, L<XML::Simple>.

=cut

Comment on CGI::ToXML
Download Code

Back to Code Catacombs

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://143079]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (10)
As of 2014-07-29 06:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (211 votes), past polls