如何将新元素添加到XML数据
问题描述:
我有一个要求为某些XML数据添加新元素。我的输入和输出如下。如何将新元素添加到XML数据
在这里,我将给DINESH
作为输入,并且必须创建新的元素。 oid
的值必须从上面的值加1。
<node nspc="DEFAULT" name="CEN509_DINESH" modl="MDL_DINESH" lcmd="node.sh" oid="5" />
感谢您的帮助
输入:
<?xml version="1.0" encoding="UTF-8"?>
<root user="gaia" pass="XY6jKWTTBfU=" desc="default user" mail="[email protected]">
<node nspc="DEFAULT" name="CEN509_ASONI" modl="MDL_ASONI" lcmd="node.sh" oid="3" />
<node nspc="DEFAULT" name="CEN509_ASTI" modl="MDL_ASTI" lcmd="node.sh" oid="4" />
</root>
输出
<?xml version="1.0" encoding="UTF-8"?>
<root user="gaia" pass="XY6jKWTTBfU=" desc="default user" mail="[email protected]">
<node nspc="DEFAULT" name="CEN509_ASONI" modl="MDL_ASONI" lcmd="node.sh" oid="3" />
<node nspc="DEFAULT" name="CEN509_ASTI" modl="MDL_ASTI" lcmd="node.sh" oid="4" />
<node nspc="DEFAULT" name="CEN509_DINESH" modl="MDL_DINESH" lcmd="node.sh" oid="5" />
</root>
答
该程序发现了最后<node>
元素,克隆并调整日e属性值,并将其附加到从中克隆的元素的父级。
use strict;
use warnings;
use XML::LibXML;
my $doc = XML::LibXML->load_xml(string => <<'END', no_blanks => 1);
<?xml version="1.0" encoding="UTF-8"?>
<root user="gaia" pass="XY6jKWTTBfU=" desc="default user" mail="[email protected]">
<node nspc="DEFAULT" name="CEN509_ASONI" modl="MDL_ASONI" lcmd="node.sh" oid="3" />
<node nspc="DEFAULT" name="CEN509_ASTI" modl="MDL_ASTI" lcmd="node.sh" oid="4" />
</root>
END
my $input = 'DINESH';
my ($lastnode) = $doc->findnodes('/root/node[last()]');
my $newnode = $lastnode->cloneNode;
my %attr = map { $_ => $newnode->getAttributeNode($_) } qw/ name modl oid /;
my $val;
$val = $attr{name}->getValue;
$val =~ s/[^_]+$/$input/;
$attr{name}->setValue($val);
$val = $attr{modl}->getValue;
$val =~ s/[^_]+$/$input/;
$attr{modl}->setValue($val);
$val = $attr{oid}->getValue;
$attr{oid}->setValue($val + 1);
$lastnode->parentNode->appendChild($newnode);
print $doc->toString(1);
输出
<?xml version="1.0" encoding="UTF-8"?>
<root user="gaia" pass="XY6jKWTTBfU=" desc="default user" mail="[email protected]">
<node nspc="DEFAULT" name="CEN509_ASONI" modl="MDL_ASONI" lcmd="node.sh" oid="3"/>
<node nspc="DEFAULT" name="CEN509_ASTI" modl="MDL_ASTI" lcmd="node.sh" oid="4"/>
<node nspc="DEFAULT" name="CEN509_DINESH" modl="MDL_DINESH" lcmd="node.sh" oid="5"/>
</root>
我知道我老了 - 但通常这是一个有点模糊之前,我穿上了规格! – 2012-08-04 07:49:41
没有输入和输出指定。请用输入和输出编辑你的文章。 – RNJ 2012-08-04 07:49:43
谢谢。我以为我是盲人! – 2012-08-04 07:51:32