XML 的相关部分如下所示
<?xml version="1.0" encoding="UTF-8"?>
<key name="home">
<entry name="default">zzzzz</entry>
<key name="ffffff"></key>
<key name="plugin">
<key name="pst">
<entry name="enable">true</entry>
</key>
</key>
<key name="hover">
<key name="doze">
<key name="eventmanager">
<key name="types"></key>
</key>
<key name="ips">
<key name="proto">
<key name="dos">
<key name="dop"></key>
</key>
</key>
</key>
</key>
</key>
.
.
.
我的代码:
#!/root/bin/perl
use strict;
use warnings;
use XML::Twig;
my $tree = XML::Twig->new(pretty_print => 'indented', keep_spaces => 1);
$tree->parsefile(shift);
my $msg =<<'MSG';
<key name="absy">
<entry name="msg"></entry>
<entry name="title"></entry>
</key>
MSG
my $client_plugin = XML::Twig::Elt->new( key => { name => 'client' } )->set_inner_xml($msg);
$client_plugin->paste(last_child => $tree->first_elt(sub { $_[0]->tag =~ m/key/ and $_[0]->att('name') =~ m/plugin/i }));
$tree->print;
问题是添加的元素出现在一行中,并且不像其他元素那样缩进。
我也尝试过 $tree->print(pretty_print => 'indented')
但没有成功。
最佳答案
XML::Twig::Elt
模块正在丢弃 inner_html
调用中无意义的空格。
同时,您已为 XML::Twig
模块指定 keep_spaces => 1
,因此它会按原样保留(缺少)空格。
删除 keep_spaces => 1
它应该适合你。
更新
您可能想看看这段代码,它与您自己的程序执行相同的操作,但使用 XPath 步骤作为条件,而不是可读性较差的匿名子例程。
use strict;
use warnings;
use XML::Twig;
my $tree = XML::Twig->new(pretty_print => 'indented');
$tree->parsefile(shift);
my $msg = <<'MSG';
<key name="absy">
<entry name="msg"/>
<entry name="title"/>
</key>
MSG
my $client_plugin = XML::Twig::Elt->new( key => { name => 'client' } );
$client_plugin->set_inner_xml($msg);
my $plugin = $tree->first_elt('key[@name="plugin"]');
$client_plugin->paste(last_child => $plugin);
$tree->print;
输出
<?xml version="1.0" encoding="UTF-8"?>
<key name="home">
<entry name="default">zzzzz</entry>
<key name="ffffff"></key>
<key name="plugin">
<key name="pst">
<entry name="enable">true</entry>
</key>
<key name="client">
<key name="absy">
<entry name="msg"/>
<entry name="title"/>
</key>
</key>
</key>
<key name="hover">
<key name="doze">
<key name="eventmanager">
<key name="types"></key>
</key>
<key name="ips">
<key name="proto">
<key name="dos">
<key name="dop"></key>
</key>
</key>
</key>
</key>
</key>
</key>
关于XML Twig 不会缩进新添加的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15365689/