XML Twig 不会缩进新添加的元素?

标签 xml perl parsing xml-twig

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/

相关文章:

python - 使用python将特殊格式的文件解析为字典列表

c# - 如何防止XDocument添加XML版本和编码信息

xml - 使用 key 函数将元素添加到 XML 无法使用 xslt

sql-server - 在sql server 2012中读取具有动态行和属性的xml

c# - 如何解析 XSD 文件

python - 如何使用 Python 解析复杂的 XML

java - FAIL - 上下文路径/salamander 中的应用程序无法启动

perl - 如何直接插入存储?

perl - 如何将flock与yaml一起使用?

database - 您如何处理严重依赖数据库的测试应用程序?