我需要在已经存在的xml文件中添加一个节点,我的xml就像: -
<Install>
<version >
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>RIBS</kind>
</version>
</Install>
在添加节点后,它应该看起来像
<Install>
<version >
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>native</kind>
</version>
<version >
<number>6.0</number>
<build>1025786</build>
<path>path</path>
<kind>native</kind>
</version>
</Install>
我尝试了以下链接的想法,但无法弄明白。 using perl insert string xml to a node
我需要添加节点并将更改保存到文件中。 它应该反映到文件中。 我是新来的,为什么不能弄明白。
我尝试的是: -
use strict;
use warnings;
use XML::Twig;
my $myXML
='<version>6.1</version>
<number>101445</number>
<path>path</path>
<kind>native</kind>
';
my $file = "C:\\Users\\bjoshi\\LightroomBuilds\\Win\\data.xml";
my $t= XML::Twig->new( twig_handlers => { grouping => sub { grouping( $myXML, @_); }, })
->parsefile( "$file") or die $!;
$t->print;
open my $xml_fh, '>', "$file" or die $!;
$t->set_pretty_print('indented_c');
$t->print($xml_fh);
exit;
sub grouping
{ my( $xml, $t, $grouping)= @_;
my $new_elt= XML::Twig::Elt->parse( $xml);
$new_elt->paste( last_child => $grouping);
}
我得到的输出是: -
<Install>
<version>
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>native</kind>
</version>
</Install>
答案 0 :(得分:2)
虽然代码from the linked answer by mirod做了你想做的同样的事情,但你需要调整它以适应你的XML。我将在下面解释我的所作所为。
use strict;
use warnings;
use XML::Twig;
my $myXML = <<'XML';
<version>
<number>6.0</number>
<build>1025786</build>
<path>path</path>
<kind>native</kind>
</version>
XML
my $t = XML::Twig->new(
twig_handlers => {
Install => sub { add_version( $myXML, @_ ); }, }
)->parse( \*DATA ) or die $!;
$t->set_pretty_print('indented_c');
$t->print;
sub add_version {
my ( $xml, $t, $install ) = @_;
my $new_elt = XML::Twig::Elt->parse($xml);
$new_elt->paste( last_child => $install );
}
__DATA__
<Install>
<version >
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>RIBS</kind>
</version>
</Install>
这不会从文件中读取,而是从DATA
文件句柄读取,该句柄包含__DATA__
以下的内容,只打印到终端/屏幕。
首先,您的预期输出是这样的:
<Install>
...
<version>
<number>6.0</number>
...
</version>
</Install>
但是你在代码中使用的要插入的XML片段是这样的:
<version>6.1</version>
<number>101445</number>
...
那不是你想说的,所以我猜这是个错误。
您从答案中获取的代码应该适用于元素<grouping>
。原则上它是相同的,但它有不同的名称。所以你需要调整代码。我更改了twig_handlers
以获得Install
的处理程序,因为这是XML的根元素。我继续重命名子程序和里面的变量以匹配它。它使得更清楚的是发生了什么。
如果你运行它,你会得到这个输出:
<Install>
<version>
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>RIBS</kind>
</version>
<version>
<number>6.0</number>
<build>1025786</build>
<path>path</path>
<kind>native</kind>
</version>
</Install>