2009-08-11 10 views
2

私は、次のXMLファイルを持っている:今PerlのXML :: Twigを使用して子要素をXMLに追加するにはどうすればよいですか?

<SOURCE_SERVER> 
    <SERVER HOSTNAME="serv1"> 
     <CIFS_SERVICE NETBIOSNAME="serv1"/> 
    </SERVER> 
    <SERVER HOSTNAME="serv2"> 
    </SERVER> 
<SOURCE_SERVER> 

は、私が<SERVER HOSTNAME="serv2">に子<CIFS_SERVICE NETBIOSNAME="serv2"/>を追加します。 XML::Twigを使用してこれを行うにはどうすればよいですか?

+2

XMLが見えるように、私はあなたのポストを再フォーマット。あなたのXMLファイルには本当に ''の終了はありませんか? ''に ''を追加したいのですか?正しい要件を反映するように投稿を編集してください。 –

+0

訂正しました。シナナ – Ninja

+1

@忍者下記の私の答えを参照してください。 'は正しいですか?それは ''ではありませんか?それ以外の場合は、XMLではありません。 –

答えて

5

ここでは、あなたの質問に合理的な修正を加えたソリューションを紹介します。以下のコードは、ドキュメントに記載されているfiltering exampleに基づいています。

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $t = XML::Twig->new(
    twig_roots => { SERVER => \&update }, 
    twig_print_outside_roots => 1, 
); 

$t->parse(\*DATA); 

sub update { 
    my ($t, $server) = @_; 
    if ('serv2' eq $server->att('HOSTNAME')) { 
     $server->insert(
      CIFS_SERVICE => { NETBIOSNAME => 'serv2' }, 
     ); 
    } 
    $server->print; 
} 


__DATA__ 
<SOURCE_SERVER> 
    <SERVER HOSTNAME="serv1"> 
     <CIFS_SERVICE NETBIOSNAME="serv1" /> 
    </SERVER> 
    <SERVER HOSTNAME="serv2"> 
    </SERVER> 
</SOURCE_SERVER> 

出力:

C:\Temp> x 
<SOURCE_SERVER> 
    <SERVER HOSTNAME="serv1"><CIFS_SERVICE NETBIOSNAME="serv1"/></SERVER> 
    <SERVER HOSTNAME="serv2"><CIFS_SERVICE NETBIOSNAME="serv2"/></SERVER> 
</SOURCE_SERVER> 
+0

シナン、あなたの答えのためにトンをありがとう。しかし、もう一つ質問があります。実際には私のXMLは次のようになります: 'タグを挿入する必要はありません。 twigはSERVERを指しており、その子の属性を設定する必要があります。どうすればいいのですか?私を助けてください。 – Ninja

+0

お返事ありがとうございました! – Ninja

関連する問題