如何使用Perl的XML :: LibXML提取标签中的属性?

Ana*_*dan 7 perl libxml2

我有一个XML文件

<PARENT >
<TAG string1="asdf" string2="asdf" >
</TAG >
</PARENT>
Run Code Online (Sandbox Code Playgroud)

我想在这里提取string2值..而且我想将它设置为一个新值..

怎么做?

zak*_*rya 16

使用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);                             
Run Code Online (Sandbox Code Playgroud)

并阅读文档,当然:)

  • @Anandan写'temme'而不是'告诉我'并不酷.事实上,它让一些像我这样的人不得不付出额外的努力来精神上解析你在说什么.您在回答问题时得到的答案质量与您撰写明确,明确定义的问题所付出的努力成正比. (6认同)
  • 当然,如果你想自己走DOM,你也可以这样做.XML :: LibXML使用W3C DOM API,它与您在Javascript中使用的API相同.所以它应该很容易熟悉(尽管API确实很糟糕,至少它是标准的). (2认同)

Log*_*gan 8

您也可以使用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);
Run Code Online (Sandbox Code Playgroud)