http://qs321.pair.com?node_id=719200


in reply to Re^2: XML::DOM - NOT_FOUND_ERR
in thread XML::DOM - NOT_FOUND_ERR

The problem is that XML::DOM is a maze of objects. And each node object can only have one parent. So you first stick the <record> object in place of the first Thammasat and then MOVE the object in place of the second. You'd have to create a brand new $ritem each time you want to replace the original.

To tell the truth, you'd most likely do better if you dumped the module and used a different. I'm surprised mirod did not already suggest his XML::Twig, anyway I'll suggest my XML::Rules:

use strict; use XML::Rules; my $link = "Thammasat"; my $rlinks = { "institute" => ["test"], "year" => ["test"], "degree" => ["test"], "faculty" => ["test"], "major" => ["test"], "gpa" => ["test"], }; my $parser = XML::Rules->new( style => 'filter', ident => ' ', rules => { _default => 'raw extended', record => sub { return $_[0] => $_[1] unless $_[1]->{':institute'}{_conten +t} eq $link; return $_[0] => $rlinks; } }, ); $parser->filterfile('employee.xml', 'employee-filtered.xml');

The additional advantage is that this scripts doesn't load the whole file into memory, it parses the file, copies everything outside the <record> tag and only ever remembers that single tag with contents.