使用XML :: Twig将XML记录添加到现有XML文件中

问题描述:

我试图在现有XML文件的某个xpath下添加一块内容。我是使用Perl进行XML解析的新手。但我本来应该使用这个XML::Twig使用XML :: Twig将XML记录添加到现有XML文件中

输入:

<model name="MDL_#USER#" oid="#LOOP#"> 
<appli name="ERETAIL" oid="2"> 
    <schema desc="Parameters schema" enab="YES" name="Parameters" oid="1" prio="1"> 
     <bean enab="YES" labl="Parameters" name="ERETAILPARA" oid="3" vers="1.0" xpos="0" ypos="0"> 
      <para> 
       <root> 
        <row desc="password encryption mode" name="OISENCRYPT" value="BASE64"/> 
       </root> 
      </para>   
     </bean> 
    </schema> 
</appli> 

输出:

<model name="MDL_#USER#" oid="#LOOP#"> 
<appli name="ERETAIL" oid="2"> 
    <schema desc="Parameters schema" enab="YES" name="Parameters" oid="1" prio="1"> 
     <bean enab="YES" labl="Parameters" name="ERETAILPARA" oid="3" vers="1.0" xpos="0" ypos="0"> 
      <para> 
       <root> 
        <row desc="password encryption mode" name="OISENCRYPT" value="BASE64"/> 
        <row name="INTERNAL" desc="" value=""> 
         <row name="PATH" desc="Path" value="#PATH#" /> 
         <row name="EXT" desc="Adresse" value="#GAIAIP#" /> 
        </row> 
       </root> 
      </para>   
     </bean> 
    </schema> 
</appli> 

+0

你好, 感谢您的以下输入 但如果我试图给路径如下我的 $ twig = XML :: Twig-> new(twig_handlers => {'/ model/appli [@ name =“ERETAIL”]/schema [@ name =“Parameters”]/bean [@ labl =“Parameters”]/para/root /'=> \&add_rows,},pretty_print =>'indented',); 我正在收到如下错误: 处理程序中无法识别的表达式:'/ model/appli [@ name =“ERETAIL”]/schema [@ name =“Parameters”]/bean [@ labl =“Parameters”]/para /根/” 能否请你帮我 – user1575765

+0

删除最后一个/路径 – mirod

XML::Twig,创建一个处理程序来修改要更改的元素。在该处理程序,创建要那么新的元素粘贴到元素作为孩子:

use XML::Twig; 

my $xml = <<'HERE'; 
<model name="MDL_#USER#" oid="#LOOP#"> 
<appli name="ERETAIL" oid="2"> 
    <schema desc="Parameters schema" enab="YES" name="Parameters" oid="1" prio="1"> 
     <bean enab="YES" labl="Parameters" name="ERETAILPARA" oid="3" vers="1.0" xpos="0" ypos="0"> 
      <para> 
       <root> 
        <row desc="password encryption mode" name="OISENCRYPT" value="BASE64"/> 
       </root> 
      </para>   
     </bean> 
    </schema> 
</appli> 
</model> 
HERE 

my $twig = XML::Twig->new(
    twig_handlers => { 
     'bean/para/root' => \&add_rows, 
     }, 
    pretty_print => 'indented', 
    ); 
$twig->parse($xml); 
$twig->print; 

请记住,在处理程序中,你得到的当前元素为$_

sub add_rows { 
    XML::Twig::Elt->new(row => { 
     name => 'PATH', 
     desc => 'Path', 
     value => '#PATH#' 
     })->paste(last_child => $_); 

    XML::Twig::Elt->new(row => { 
     name => 'EXT', 
     desc => 'Adresse', 
     value => '#GAIAIP#' 
     })->paste(last_child => $_); 
    } 
+0

您好布赖恩, 感谢您的输入,但如果我想给路径类似如下 我的$树枝= XML :: Twig->新( twig_handlers => { '/ model/appli [@ name =“ERETAIL”]/schema [@ name =“Parameters”]/bean [@ labl =“Parameters”]/para/root /'=> \&add_rows, }, pretty_print =>'indented', ); 我在处理程序中收到如下错误,无法识别:'/ model/appli [@ name =“ERETAIL”]/schema [@ name = “Parameters”]/bean [@ labl =“Parameters”]/para/root /'在sample2.pl第60行你能帮我吗 – user1575765

+1

如果你有一个新的问题,请提出一个新的问题。也许有人可以帮助你。 –