我需要编辑一个包含以下行的xml文件:
<language name="en_US" title="sprint" subtitle="" url="sprint/en_US/index.html">
我的带有XML :: Simple的perl脚本工作正常,期望我无法以这种格式输出。我明白了:
<language>
<name>en_US</name>
<subtitle>My new subtitle</subtitle>
<title>sprint</title>
<url>sprint/en_US/index.html</url>
</language>
原则上这很好,但是这里输出文件使用diff与输入文件进行同步。我可以强制XML :: Simple使用与输入样式相同的输出样式吗? 我的代码是: 使用XML :: Simple;
my $xml = XMLin(
'a.xml',
KeepRoot => 1,
ForceArray => 1,
);
# editing xml
XMLout(
$xml,
KeepRoot => 1,
NoAttr => 1,
OutputFile => 'b.xml',
);
THX
答案 0 :(得分:2)
首先关闭 - XML::Simple
谎言。它不是,它是简单的XML。从它的文档:
不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。
NoAttr正在对你这样做:
NoAttr =&gt; 1#in + out - 得心应手
与XMLout()一起使用时,生成的XML将不包含任何属性。所有散列键/值都将表示为嵌套元素。
当与XMLin()一起使用时,XML中的任何属性都将被忽略。
您可能发现在NoAttr
上指定XMLin
会做您想做的事情吗?
但我建议改为 - 使用XML::Twig
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $xml =
'<language name="en_US" title="sprint" subtitle="" url="sprint/en_US/index.html" />';
my $twig = XML::Twig->new->parse($xml);
foreach my $key ( keys %{ $twig->root->atts() } ) {
print "$key => ", $twig->root->att($key), "\n";
}
$twig->root->del_att('name');
print "With 'name' removed:\n";
$twig->root->print;
如果你能给我一些比较的输入/输出样本,我可以更多地充实这个例子。你可能不想在这里使用root
,因为那只是'top'元素 - 但请考虑这个说明。您可以执行foreach ( $twig -> root -> children ) {
类型迭代。