-1

我需要向某些 XML 数据添加新元素。我的输入和输出如下。

在这里,我将DINESH在输入中给出,并且必须创建新元素。该oid值必须从上面增加一。

<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="dinesh@gmail.com">
  <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="dinesh@gmail.com">
  <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>
4

1 回答 1

2

该程序找到最后一个<node>元素,将其克隆并调整属性值,并将其附加到克隆它的元素的父元素。

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="dinesh@gmail.com">
  <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="dinesh@gmail.com">
  <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-04T08:57:43.503 回答