0

既存の 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>

4

1 に答える 1

2

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 => $_ );
    }
于 2012-08-17T05:34:57.127 に答える