2009-08-11 3 views
2

У меня есть следующий XML-файл:Как добавить дочерние элементы в XML с помощью Perl XML :: Twig?

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

Теперь я хочу добавить ребенка <CIFS_SERVICE NETBIOSNAME="serv2"/> к <SERVER HOSTNAME="serv2">. Как это сделать, используя XML::Twig?

+2

Я переформатировать свой пост, так что XML видно. Действительно ли в вашем XML-файле не закрывается ''? Вы имели в виду, что хотите добавить '' to ''? Пожалуйста, отредактируйте свое сообщение, чтобы отразить правильные требования. –

+0

Я сделал исправление Синан – Ninja

+1

@Ninja См. Мой ответ ниже. Является '' CIFS_SERVICE NETBIOSNAME = "serv1"> 'правильным? Не должно быть ''? В противном случае это не 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

Sinan, спасибо тонну за ваш ответ. Однако у меня есть еще один запрос. На самом деле мой xml выглядит так: '' Итак, я не нужно вставлять тег . Веточка указывает на SERVER, и мне нужно установить атрибут его дочернего элемента. Как мне это сделать? Пожалуйста, помогите мне. – Ninja

+0

Большое спасибо за ваш ответ Синан! – Ninja

Смежные вопросы