tags:

views:

65

answers:

1

I would like to insert updev.xml to the mainea.xml if $upd_dev_id is not equal. Tried this below but it won't insert. Replace works.

#!c:\perl\bin\perl.exe
use strict;
use XML::Twig;

my $upd_file = "updev.xml" ;
my $main_file = "mainea.xml" ;


# get the info we need by loading the update file
my $t_upd= new XML::Twig();
$t_upd->parsefile( $upd_file);

my $upd_dev_id = $t_upd->root->next_elt( 'DEVNUM')->text;
my $upd_dev    = $t_upd->root->next_elt( 'DEVS');

# now process the main file
my $t= new XML::Twig( TwigHandlers => { DEVS => \&DEVS, },
        PrettyPrint => 'indented',
      );
$t->parsefile( $main_file);
$t->flush;           # don't forget or the last closing tags won't be printed

sub DEVS
  { my( $t, $DEVS)= @_;
    # just replace devs if the previous dev_id is the right one
    if( $DEVS->prev_elt( 'DEVNUM')->text eq $upd_dev_id) {
      $upd_dev->replace( $DEVS); 
    }
    else
    {
      $upd_dev->insert( $DEVS);
    }

    $t->flush;    # print and flush memory so only one job is in there at once
  }
A: 

insert doesn't do what you think it does, it doesn't insert an element, it inserts a tag under an existing element. What you want is paste.

compare:

insert ($tag1, [$optional_atts1], $tag2, [$optional_atts2],...)

For each tag in the list inserts an element $tag as the only child of the element. The element gets the optional attributes in"$optional_atts." All children of the element are set as children of the new element. The upper level element is returned.

with:

paste ($optional_position, $ref)

Paste a (previously "cut" or newly generated) element. Die if the element already belongs to a tree.

You will probably have to cut, or copy the element before pasting it in the new tree.

mirod
Thanks Mirod that works. Had to copy it first.
Cobra