2013-03-12 39 views
2

的XML的相关部分看起来像XML Twig不缩进新添加的元素?

<?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')没有运气。

回答

4

XML::Twig::Elt模块将从inner_html呼叫中丢弃无用的空格。

同时,您已指定keep_spaces => 1,对于XML::Twig模块,它保留(缺少)空格。

删除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> 
+0

更接近原代码,你也可以对属性值的正则表达式:'我的$插件= $树形> first_elt(“键[@ name =〜/ plugin/i]');' - 顺便说一句,这是一些严重丑陋的XML你在这里! – mirod 2013-03-12 17:30:41