XML::Bare perl的问题

XML::Bare perl的问题,xml,perl,parsing,Xml,Perl,Parsing,我正在使用perl中的模块 我的xml类似于: <xml> <element num="1"> <num>10</num> </element> <element num="2"> <num>20</num> </element> </xml> 10 20 我想提取出包含在child标记中的值。i、 e.我希

我正在使用perl中的模块

我的xml类似于:

<xml>
    <element num="1">
        <num>10</num>
    </element>
    <element num="2">
        <num>20</num>
    </element>
</xml>

10
20
我想提取出包含在child
标记中的值。i、 e.我希望
10和20
作为输出。但是,当我使用
$xml->{element}->[$I]->{num}->{value}
获取值时,它返回
1adn2
即返回值为
num
属性,而不是子节点。 有谁能帮我处理属性和子名称相同的情况吗


谢谢

它看起来像
XML::Bare
中的一个bug。我在
转储程序
输出中没有看到
元素:

use warnings;
use strict;
use XML::Bare;

my $xml = q(
<xml>
    <element num="1">
        <num>10</num>
    </element>
    <element num="2">
        <num>20</num>
    </element>
</xml>
);

my $ob = new XML::Bare( text => $xml );
my $root = $ob->parse();

use Data::Dumper;
$Data::Dumper::Sortkeys=1;
print Dumper($root);

__END__

$VAR1 = {
          '_i' => 0,
          '_pos' => 0,
          '_z' => 0,
          'value' => '
',
          'xml' => {
                     '_i' => 438404290,
                     '_pos' => 1,
                     '_z' => 130,
                     'element' => [
                                    {
                                      '_i' => 438404300,
                                      '_pos' => 2,
                                      '_z' => 64,
                                      'num' => {
                                                 '_att' => 1,
                                                 'value' => '1'
                                               },
                                      'value' => '
        '
                                    },
                                    {
                                      '_i' => 438404359,
                                      '_pos' => 4,
                                      '_z' => 123,
                                      'num' => {
                                                 '_att' => 1,
                                                 'value' => '2'
                                               },
                                      'value' => '
        '
                                    }
                                  ],
                     'value' => '
    '
                   }
        };
如果使用或,则应仅限于最基本的XML读取。假设您的数据具有一个属性,且子节点共享一个名称,则该限制将失效

但事实上,除非有特定的理由不这样做,否则应该坚持使用更现代的XML解析器,如和以及XPath支持的全部功能

下面将使用这两个模块解析XML:

use strict;
use warnings;

use XML::LibXML;
use XML::Twig;

my $data = do {local $/; <DATA>};

print "XML::LibXML\n";
my $xml = XML::LibXML->load_xml(string => $data);
for my $node ($xml->findnodes('//element/num')) {
    print $node->textContent(), "\n";
}

print "XML::Twig\n";
my $t = XML::Twig->new( 
    twig_handlers => {
        '//element/num' => sub { print $_->text(), "\n" },
    },
);
$t->parse( $data );

__DATA__
<xml>
    <element num="1">
        <num>10</num>
    </element>
    <element num="2">
        <num>20</num>
    </element>
</xml>

谢谢,我也在想同样的…:)XML::Simple和XML::Bare使用的数据结构无法处理具有相同名称的属性和子元素的元素,因为
$ele->{num}
表示“名为
num
的属性或子元素”。
use strict;
use warnings;

use XML::LibXML;
use XML::Twig;

my $data = do {local $/; <DATA>};

print "XML::LibXML\n";
my $xml = XML::LibXML->load_xml(string => $data);
for my $node ($xml->findnodes('//element/num')) {
    print $node->textContent(), "\n";
}

print "XML::Twig\n";
my $t = XML::Twig->new( 
    twig_handlers => {
        '//element/num' => sub { print $_->text(), "\n" },
    },
);
$t->parse( $data );

__DATA__
<xml>
    <element num="1">
        <num>10</num>
    </element>
    <element num="2">
        <num>20</num>
    </element>
</xml>
XML::LibXML
10
20
XML::Twig
10
20