如何向XML数据添加新元素

如何向XML数据添加新元素,xml,perl,Xml,Perl,我需要在一些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="XY6jK

我需要在一些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>
<?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>

此程序查找最后一个
元素,克隆它并调整属性值,然后将其附加到克隆它的元素的父元素

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::LibXML;
my$doc=XML::LibXML->load_XML(string=>$newnode->getAttributeNode($))}qw/name modl oid/;
我的$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);
打印$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>
<?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>


我知道我已经老了,但在我加入规格之前,它通常有点模糊!没有指定输入和输出。请用输入和输出编辑你的帖子。谢谢。我以为我是瞎子!@user1575765:你为什么再次删除格式。其次,你的问题有点太宽泛了(甚至没有问题)。在大多数情况下,您将使用XML解析器来读取和操作XML文件。那么,您的问题到底是什么?使用xpath获取您想要增加的值。然后,您有很多选择来添加新元素。