gpt4 book ai didi

Perl libXML 按属性值查找节点

转载 作者:行者123 更新时间:2023-12-03 20:18:58 29 4
gpt4 key购买 nike

我有我正在迭代的非常大的 XML 文档。 XML 主要使用属性而不是节点值。我可能需要在文件中找到许多节点来拼凑一组信息。它们通过不同的 ref 标签值联系在一起。目前,每次我需要定位其中一个节点以从中提取数据时,我都会遍历整个 XML 并对属性进行匹配以找到正确的节点。有没有更有效的方法来只选择给定属性值的节点而不是不断循环和比较?我当前的代码太慢了,几乎没用。

目前,我在同一个文件中为许多不同的节点和属性组合做了很多次这样的事情。

my $searchID = "1234";
foreach my $nodes ($xc->findnodes('/plm:PLMXML/plm:ExternalFile')) {
my $ID = $nodes->findvalue('@id');
my $File = $nodes->findvalue('@locationRef');
if ( $searchID eq $ID ) {
print "The File Name = $File\n";
}
}

在上面的示例中,我循环并使用“if”来比较 ID 匹配。我希望我可以在下面做这样的事情来只按属性匹配节点......它会比循环更有效吗?
my $searchID = "1234";
$nodes = ($xc->findnodes('/plm:PLMXML/plm:ExternalFile[@id=$searchID]'));
my $File = $nodes->findvalue('@locationRef');
print "The File Name = $File\n";

最佳答案

执行一次以将您需要的信息提取为更方便的格式或构建索引。

my %nodes_by_id;
for my $node ($xc->findnodes('//*[@id]')) {
$nodes_by_id{ $node->getAttribute('id') } = $node;
}

然后你的循环变成
my $node = $nodes_by_id{'1234'};

(并停止使用 findvalue 而不是 getAttribute 。)

关于Perl libXML 按属性值查找节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231554/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com