|
Posted by Bob Bessares on April 12, 2007, 5:15 am
Please log in for more thread options
> What is the best module to use for reading in an XML file, modifying a
> field and then writing it back to file? There seem to be a lot of XML
> parsers out there....
>
> Thanks,
> B
it may be helpful to get some more specifics but I have used XML::DOM
for editing parts of xml files. The syntax is nice and intuitive e.g.
replaceChild, removeChild, appendChild, addText etc...
http://search.cpan.org/dist/XML-DOM/lib/XML/DOM.pm
Here's an eg using it that alters, deletes and adds a new node to a
document:
-----------------------------------
use XML::DOM;
my $xml =<<EOXML;
<?xml version="1.0"?>
<IDList>
<Details><id>Test ID</id>
<name>Bob</name></Details>
<Details><id>Test ID</id>
<name>Brent</name></Details>
<Details><id>Test ID</id>
<name>Bren</name></Details>
<Details><id>Test ID</id>
<name>Butch</name></Details>
<Details><id>Test ID</id>
<name>Ben</name></Details>
</IDList>
EOXML
my $parser = new XML::DOM::Parser;
my $doc = $parser->parse($xml);
my $root = $doc->getDocumentElement();
foreach my $detail (@)
{
my $name_el = $detail->getElementsByTagName('name')->[0];
my $name = $name_el->getFirstChild();
if ($name->toString() =~ /Bob/)
{
my $new = $doc->createTextNode('Foo');
$name_el->replaceChild($new, $name);
}
elsif ( $name->toString() =~ /Ben/ )
{
$root->removeChild($detail);
}
}
my $newdet = $doc->createElement('Details');
my $new_id = $doc->createElement('id');
my $new_id_val = $doc->createTextNode('New ID');
$new_id->appendChild($new_id_val);
$newdet->appendChild($new_id);
my $new_name = $doc->createElement('name');
my $new_name_val = $doc->createTextNode('Yargle');
$new_name->appendChild($new_name_val);
$newdet->appendChild($new_name);
$root->appendChild($newdet);
print $doc->toString();
------------------------------------
|