【问题标题】:Adding XML record into existing XML file using XML::Twig使用 XML::Twig 将 XML 记录添加到现有 XML 文件中
【发布时间】:2012-08-17 13:34:57
【问题描述】:

我试图在现有 XML 文件的某个 xpath 下添加一个内容块。我不熟悉使用 Perl 进行这种 XML 解析。但我应该使用这个XML::Twig

输入:

  <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>

【问题讨论】:

  • 您好,感谢您的以下输入,但如果我尝试给出如下所示的路径,我的 $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/root/ '你能帮帮我吗
  • 去掉路径中的最后一个/

标签: perl xml-twig


【解决方案1】:

对于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 => $_ );
    }

【讨论】:

  • 你好布赖恩,谢谢你的意见,但如果我试图给出如下路径我的 $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/root/ ' 在 sample2.pl 第 60 行,你能帮帮我吗
  • 如果您有新问题,请提出新问题。也许有人可以帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多