xml - 如何使用 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
解决方案
这是另一种使用方法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;
}
}
}
推荐阅读
- node.js - Visual Studio 2022 在 WSL2 Linux 中打开 javascript/nodejs 项目文件夹的能力是否与 VS Code 一样?
- c# - 负会计货币价值的正则表达式?
- php - 如何使用 PHP 单元 @covers 注释来指示测试应涵盖方法的所有子实现?
- python - 如何让 SWIG 将 const char* 的返回值视为二进制数据(对于 Python)?
- reactjs - Django 在 React 中的分页
- firebase - Firebase 获得活跃用户的采用率
- java - 必须在调用 save() 之前手动分配此类的 ID:com.employeesService.EmployeesService.model.Employee
- sql-server - 在 ADF 管道中执行的存储过程 - 性能问题
- python - 比较 DataFrame 中的值并用最接近的值替换,给定一个列表
- ios - swift 属性未在 super.init 调用中初始化