Как я могу использовать Perl XML :: LibXML для извлечения атрибута в теге?

У меня есть XML файл

<PARENT >
<TAG string1="asdf" string2="asdf" >
</TAG >
</PARENT>

Я хочу извлечь здесь значение string2 .. и также хочу установить для него новое значение ..

Как это сделать?


person Anandan    schedule 06.08.2009    source источник


Ответы (4)


Используйте выражения XPath

use strict;                                                                                                                      
use warnings;                                                                                                                    

use XML::LibXML;                                                                                                                 
use Data::Dumper;                                                                                                                

my $doc = XML::LibXML->new->parse_string(q{                                                                                      
<PARENT>                                                                                                                         
    <TAG string1="asdf" string2="asdfd">                                                                                         
    </TAG>                                                                                                                       
</PARENT>                                                                                                                        
});                                                                                                                              

my $xpath = '/PARENT/TAG/@string2';                                                                                              
# getting value of attribute:                                                                                                    
print Dumper $doc->findvalue($xpath);                                                                                            
my ($attr) = $doc->findnodes($xpath);                                                                                            

# setting new value:                                                                                                             
$attr->setValue('dfdsa');                                                                                                        
print Dumper $doc->findvalue($xpath);                                                                                            

# do following if you need to get string representation of your XML structure
print Dumper $doc->toString(1);                             

И, конечно, читайте документацию :)

person zakovyrya    schedule 06.08.2009
comment
И, конечно же, если вы хотите самостоятельно пройтись по DOM, вы тоже можете это сделать. XML :: LibXML использует W3C DOM API, тот же самый, что вы используете в Javascript. Так что это должно быть хорошо знакомо (хотя API действительно отстой, по крайней мере, он стандартный). - person jrockway; 07.08.2009
comment
@Anandan писать «temme» вместо «скажи мне» - это не круто. Фактически, это отталкивает некоторых людей, таких как я, которым приходится прилагать дополнительные усилия, чтобы мысленно проанализировать то, что вы говорите. Качество ответов, которые вы получаете в ответ на свои вопросы, прямо пропорционально усилиям, которые вы прикладываете для составления четких, четко сформулированных вопросов. - person Sinan Ünür; 07.08.2009
comment
@jrockway дерьмовый DOM API можно относительно легко исправить с помощью нескольких тонких оберток, которые сделают его более привлекательным. Самым большим преимуществом XML :: LibXML перед другими, по общему признанию, более удобными модулями остается его производительность. И скорость, и память - person zakovyrya; 08.08.2009

Вы также можете использовать XML :: Parser, чтобы получить значение. Для получения дополнительной информации см. документацию XML :: Parser:

#!/usr/local/bin/perl
use strict;
use warnings;


use XML::Parser;
use Data::Dumper;

my $attributes = {};

my $start_handler = sub
{
    my ( $expat, $elem, %attr ) = @_;
    if ($elem eq 'TAG')
    {
        $attributes->{$attr{'string1'}} = 'Found';
    }
};


my $p1 = new XML::Parser(
        Handlers => {
            Start => $start_handler
        }
);

$p1->parsefile('test.xml');

print Dumper($attributes);
person Logan    schedule 06.08.2009

Думаю, вам лучше начать с XML :: Simple и поиграть с сначала немного:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;

my $xml = XMLin(\*DATA);

print $xml->{TAG}->{string2}, "\n";

$xml->{TAG}->{string2} = "asdf";

print XMLout( $xml, RootName => 'PARENT');

__DATA__
<PARENT>
<TAG string1="asdf" string2="value of string 2">
</TAG>
</PARENT>
person Sinan Ünür    schedule 07.08.2009
comment
Внешне выглядит просто, но структуры данных xml :: simple потребляют память для больших документов, и процесс становится действительно загадочным и очень быстро. - person singingfish; 08.08.2009
comment
@singingfish Взгляните на сообщение OP еще раз. Он не знает достаточно, чтобы начать изучение других библиотек. Ему нужно сделать немного, чтобы выучить кое-что, чтобы он мог добраться до стадии, когда он знает, что вы имеете в виду в своем комментарии. - person Sinan Ünür; 08.08.2009

Спасибо за ответы. Я нашел другой ответ в "Обработка файла конфигурации с помощью LibXML2" который я нашел очень полезным.

person Anandan    schedule 10.08.2009