2014-04-29 86 views
1

我有一个很大的xml,我想替换其中一个节点的属性。我有一个代码来替换给定节点的属性值,但它不写入磁盘。我不知道我应该如何将这些更改传播到磁盘?替换XML内容并写入磁盘

对于例如:example.1.xml

<chairman name="abc" > 
<vicechairman name="def"> 
<employee name="ghi" salary="123" designation="xyz"/> 
</vicechairman> 
</chairman> 

在上面的例子中,我想改变雇员的节点的值与“薪水=” 123“”属性为“薪水=” 456“”使得上面的XML改变:

<chairman name="abc" > 
<vicechairman name="def"> 
<employee name="ghi" salary="456" designation="xyz"/> 
</vicechairman> 
</chairman> 

我已经下面的代码段,其获取到的“雇员”节点之后改变属性值设置为“薪水= 456”,但不写入到磁盘:

foreach my $anode (@attributes){ 
    my $attr = $anode->nodeName; 
    if($attr eq "salary"){ 
     $anode->setValue("456"); 
    } 
} 

任何帮助将被赞赏。由于

回答

1

如果使用XML::LibXML,明确写入修改后的内容到硬盘:

# save 
open my $out, '>', 'out.xml'; 
binmode $out; # as above 
$doc->toFH($out); 
# or 
print {$out} $doc->toString(); 
+0

这会复制我的整个XML内容仅改变属性值中的一个?我不知道这将如何工作? – user640232

+0

任何不使用$ doc-> toFile的理由? – Zaid

+0

任何输出方法都可以工作,Zaid。只是想列出两个选项。 – Miller

0

随着XML ::嫩枝:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $old_sal="123"; 
my $new_sal="456"; 

XML::Twig->new(twig_roots => { qq{employee[\@salary="$old_sal"]} 
            => sub { $_->set_att(salary => $new_sal); $_->flush; } 
           }, 
       twig_print_outside_roots => 1, 
      ) 
     ->parsefile_inplace('emp.xml'); 

此更新inplace.If你不想文件就地更新,使用->print_to_file('out.xml')

这将工作不使用的内存,因为只有触发处理程序的节点在内存中加载(和删除ü一次sed,所以在任何时候你只有一个记忆)。

+0

()方法,我相信这会工作,但不知何故,我仅限于使用的libxml。谢谢你的帮助 – user640232