属性に多くのデータがある可能性のあるXMLノードを処理しようとしています。属性のリストを取得したいのですが、XML :: LibXML :: Readerでそれを実現する方法がわかりませんか?
を使用attributeCount
すると、属性の数を取得でき、を使用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
ノードの浅いコピーを使用します。
if ($reader->name eq 'item'
&& $reader->nodeType == XML_READER_TYPE_ELEMENT
) {
for my $attr ($reader->copyCurrentNode(0)->getAttributes) {
say join '=', $attr->name, $attr->value;
}
}
XML :: LibXML :: ElementにもXML :: LibXML :: NodeにもgetAttributes
文書化されていないようです。を使用するか、要素をハッシュ参照として扱い、そのキーを要求することもできます。attributes
my $item = $reader->copyCurrentNode(0);
for my $attr (keys %$item) {
say join '=', $attr, $item->{$attr};
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加