首页 > 解决方案 > 如何使用 XML::LibXML::Reader 获取属性名称列表?

问题描述

我尝试处理属性中可能包含许多数据的 XML 节点。我想获取属性列表,但不知道如何使用XML::LibXML::Reader来实现它?

WithattributeCount我可以得到属性的计数并getAttributeNo迭代它们,但这给我的只是值,而不是属性名称。

我希望看到类似的东西getAttributes,但是属性没有这样的方法

示例代码:

use strict; use warnings; use 5.010;

use XML::LibXML::Reader;

my $reader = XML::LibXML::Reader->new(IO => \*DATA)
    or die "Cannot read from \\*DATA\n";

while ($reader->read) {
  processNode($reader);
}

sub processNode {
  my $reader = shift;


  if ( $reader->name eq 'item' ) {
    my $count = $reader->attributeCount; 
    say "item has $count attributes";

    for (my $i = 0; $i < $count; $i++) {
      say $reader->getAttributeNo( $i );
    }

    # this would my desired way to access attributes:
    # for my $attr ( $reader->getAttributes ) { 
    #   say "$attr ". $reader->getAttribute( $attr );
    # }
  }
}

__DATA__
<items>
  <item code="PK7000346" name="Lucky" class="MUU" purchaseprice="0.2983" object="UPK" hasvariants="0" ts="2019-06-19T20:04:47"/>
</items>

所需的输出是散列或名称/值对,如下所示:

code PK7000346
name Lucky
class MUU
purchaseprice 0.2983
object UPK
hasvariants 0
ts 2019-06-19T20:04:47

标签: xmlperlxml-parsing

解决方案


这是另一种使用方法moveToAttribute

sub processNode {
  my $reader = shift;

  if ( $reader->name eq 'item' ) {
      my $count = $reader->attributeCount;
      for (my $i = 0; $i < $count; $i++) {
          $reader->moveToAttributeNo( $i );
          say $reader->name, " = ", $reader->value;
      }
   }
}

推荐阅读