2012-08-04 96 views
-1

我有一个要求为某些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> 
+1

我知道我老了 - 但通常这是一个有点模糊之前,我穿上了规格! – 2012-08-04 07:49:41

+0

没有输入和输出指定。请用输入和输出编辑你的文章。 – RNJ 2012-08-04 07:49:43

+0

谢谢。我以为我是盲人! – 2012-08-04 07:51:32

回答

2

该程序发现了最后<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>