xmldom02.pl to HTML.

index -|- end

Generated: Sun Apr 15 11:46:52 2012 from xmldom02.pl 2011/11/01 4.2 KB.

#!/perl -w
# NAME: xmldom02.pl
# AIM: Like xmldom01.pl, some more experiments with XML::DOM ...
use strict;
use warnings;
use XML::DOM;
require 'logfile.pl' or die "Unable to load logfile.pl ...\n";
# log file stuff
my ($LF);
my $pgmname = $0;
if ($pgmname =~ /\w{1}:\\.*/) {
   my @tmpsp = split(/\\/,$pgmname);
   $pgmname = $tmpsp[-1];
}
my $outfile = "temp.$pgmname.txt";
open_log($outfile);
###prt( "$0 ... Hello, World ...\n" );
###my $in_file = 'C:\Documents and Settings\Geoff McLane\Desktop\Maroc - June, 2008.flash\imagelist.xml';
###my $in_tag1 = 'Image';
###my $in_tag2 = 'size_0';
my $in_file = 'C:\FG\29\Atlas-0.4.9\projects\msvc\mapserv.xml';
my $in_tag1 = 'Layers';
my $in_tag2 = 'TileSet';
my $out_file = 'tempimagelist.xml';

my $do_image_tag = 0;

# forward refs
sub traverse_node($$);

sub traverse_node($$) {
   my ($all, $node)= @_;
   my $txt = '';
   if ($node->getNodeType == ELEMENT_NODE) {
      if ($all) {
         $txt .= "<". $node->getNodeName. ">";
      }
       foreach my $child ($node->getChildNodes()) {
         $txt .= traverse_node($all, $child);
      }
      if ($all) {
         $txt .= "</". $node->getNodeName. ">\n";
      }
   } elsif ($node->getNodeType() == TEXT_NODE) {
      $txt .= $node->getData;
   }
   return $txt
}

if (! -f $in_file) {
    prt("ERROR: Can NOT find file [$in_file]!\n");
    exit(1);
}

my $parser = XML::DOM::Parser->new();
my $doc = $parser->parsefile($in_file);

my $cnt = 0;
my @files = $doc->getElementsByTagName($in_tag2);

foreach my $file (@files) {
   $cnt++;
   if ($cnt < 5) {
      prt( "$cnt: $in_tag2 = [".traverse_node(1, $file)."]\n" );
   } else {
      ###prt( "." );
   }
}
prt( "\nUsing tag $in_tag2, found $cnt files ...\n\n" );

my @images = $doc->getElementsByTagName($in_tag1);
$cnt = 0;
foreach my $chd (@images) {
   foreach my $cnode ( $chd->getChildNodes() ) {
      $cnt++;
      if ($cnt < 5) {
         my $nt = trim_all(traverse_node(1, $cnode));
         ###prt( "$cnt: text = [".traverse_node(1, $cnode)."]\n" );
         prt( "$cnt: text = [".$nt."]\n" ) if (length($nt));
      }
   }
}
prt( "\nUsing tag $in_tag1, found $cnt nodes ...\n\n" );

if ($do_image_tag) {
    $cnt = 0;
    foreach my $images ($doc->getElementsByTagName('Image')) {
        $cnt++;
        if ($cnt < 5) {
            prt("size_0: ".$images->getElementsByTagName('size_0')->item(0)->getFirstChild->getNodeValue . "\n");
            prt("size_2: ".$images->getElementsByTagName('size_2')->item(0)->getFirstChild->getNodeValue . "\n");
            #prt("info:   ".$images->getElementsByTagName('info')->item(0)->getFirstChild->getNodeValue . "\n");
            ##my $inf = $images->getElementsByTagName('info');
            my $inf = $images->getElementsByTagName('info')->item(0);
            ##my $inf = $images->getElementsByTagName('info')->item(0)->getFirstChild;
            my $val = "This is $cnt node";
            if (defined $inf) {
                $inf->addText($val);
                #if( setTextValue( $inf, $val ) ) {
                    prt( "Text added ...\n");
                #} else {
                #   prt( "Text failed 1...\n" );
                #}
            } else {
                if ($inf = appendText($doc, $images, 'info', $val)) {
                    prt( "Text appended ...\n");
                } else {
                    prt( "Text failed 2...\n" );
                }
            }
        }
    }

    prt( "\nUsing tag Image, found $cnt nodes ...\n\n" );
}

my $newtxt = $doc->toString();
#prt( "Output ...\n".$newtxt."\n" );
write2file($newtxt, $out_file);
prt( "Written $out_file ...\n" );
close_log($outfile,1);
exit(0);
###############################

sub appendText {
   my ($doc, $match, $nodename, $value) = @_;
   if (! $match) {
      return undef;
   }
   my $newnode;
   eval {
      $newnode = $doc->createElement( $nodename );
   };

   if ($@ || (! defined($newnode) )) {
      return undef;
   }

   $match->appendChild( $newnode );

   if ( defined($value) ) {
      $newnode->addText($value);
   }

   return $newnode;
}

sub setTextValue {
  my ($match, $value) = @_;
  if (! defined($match) ) {
     return undef;
  }
  
  #foreach my $child ( $match->getChildNodes() ) {
   #  $match->removeChild ($child);
  #}

  $match->addText($value);

  return $match;
}


# eof

index -|- top

checked by tidy  Valid HTML 4.01 Transitional