如何用perl来修改XML文件,perl::simple 模块可以读出XML中的值,但如何修改XML文件呢?

例如:xml文件如下,我想实现复制多个<User>...</User>,并将其加入到<Users>节点底下,并且要修改每个user的内容。
<Users>

<User Name="test1">
<Option Name="Pass">5a105e8b9d40e1329780d62ea2265d8a</Option>
<Permissions>
<Permission Dir="C:\user\test1">
<Option Name="FileRead">1</Option>
<Option Name="FileWrite">0</Option>
</Permission>
</Permissions>
</User>
</Users>

#先用XMLin读进来,
$ref=XMLin($fh)
my $template = {
Name => $ref->{Users}->{User}->{Name},
Permissions=> $ref->{Users}->{User}->{Permissions},
};

$template->{Name} = 'test2';

push @{$ref->{Users}->{User}},$template;

#最后再用XMLout写出去
XMLout($ref);追问

XMLout写出去好像默认格式为UTF-8 。print Dumper($data) 在命令行中文都都可以显示,但是为啥$xml2->XMLout($data,outputfile => "ceshi2.xml",XMLDecl =>""); 出来的ceshi2.xml中中文为乱码? 一定要回啊!我都纠结一周了

追答

perl 默认将读入内存的变量都转为UTF-8的。
把输出的XML文件按照UTF-8格式显示。

或者用Encode,把中文部分的内容转一下GB2312。不过我没试过,可尝试一下。

温馨提示:内容为网友见解,仅供参考
无其他回答

如何利用Perl解析XML文件
XML::解析器系列 最初的Perl解析器XML::Parser::Expat由LarryWall在几年前编写并由ClarkCooper保持延续。模块作为ExpatXMLparser的界面由JamesClark用C语言编写且已经被一些脚本语言所采用。Perl解析XML文件中Expat是一个以事件为基础的解析器,意味着特定条件触发处理功能。例如,一个开始或结尾标记将触发适...

perl中用XML::Simple模块写xml文件时,怎么确定属性的顺序?
很简单,你把希望打印的文本存到文件里,比如test.xml,然后用XML::Simple打开它,然后用Data::Dumper把数据dump出来打印到屏幕上。use strict;use warnings;use XML::Simple;use Data::Dumper;my $xml = new XML::Simple;my $test = "test.xml";open(IN, "< $test") or die("Error: coul...

windows 下perl 如何安装 xml:dom
1.直接从CPAN上下载这个模块,然后安装。2.如果你装的是ActivePerl,里面有个PPM,在里面搜索,然后安装。3.先安装cpan模块,然后运行cpan -i xml:dom。

linux下perl,sed,shell批量替换文件内容
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http:\/\/www.111cn.net\/phper\/php.html“ 替换为”http:\/\/www.111cn.net“.find -name 'pom.xml' | xargs perl -pi -e 's...

perl FTP模块中put 的应用
Cannot open Local file xxxxxxx.xml 这样的提示,表示你的本地文件不存在,本地文件可以使用全称(包含路径),远程文件不能含有目录,只有名字,当然是自动建立,如果存在同名文件会覆盖。

如何通过属性的值删除对应xml文件的节点?
1、你希望的是删除 属性里面code为“永久”的节点 2、遍历整个XML节点,在每个节点中找是否存在名为code的属性,如果有的话,再判断是否值为“永久”3、如果遍历过程中找到符合你的条件的节点,就删除

关于perl 读取文件的疑惑:
Dir--File1 Subdir --File2 File3 Subdir2--File4 因为你进了 Subdir 就没再出来过;所以显示不全 &get_dir 逻辑有问题; 用 File::Find

怎么用perl把两个列进行相比较并列出不同的?
没必要用perl,excel就可以了,把其中一列贴到记事本,然后贴回excel里面(记住,贴回去的时候要把所有内容贴到一个单元格里面),然后用find函数就可以找到不同的了。比如说你给出来的是列A和列B。1.把列A的东西复制到记事本,然后全部贴到C1里面。2.在D1写公式 "=find(left(B1,4),C$1)"...

...configure: error: XML::Parser perl module is required for intlto...
执行 cpan install XML::Parser (需要网络)这个提示是告诉你Perl解释器检查依赖时发现“你的脚本”或“你脚本引用的模块”引用了XML::Parser,有网络的话,用这个方法装一个就好了

用PERL COPY文件从一个目录到另一个目录,并改名字
使用COPY命令就好了,xcopy多用于拷贝目录 copy \/Y sourcefile targetfile \/Y 用于覆盖不提示

相似回答