XML:Find XML 中的特定节点使用 LibXML

XML:Find particular node in XML using LibXML

我有一个 XML 文件,其中只有一个名为导入的节点。我想找到 import 的 href 属性。我尝试使用 findnodes(),但是 returns 一个我必须进一步搜索的列表,所以我希望有一种方法可以找到只出现一次的特定节点。 我尝试了 getChildrenByTagName 但这给出了错误

Can't locate object method "getChildrenByTagName" via package "XML::LibXML::Document"

我也尝试了 grep,它给出了类似的错误

Can't locate object method "grep" via package "XML::LibXML::Document"

我的 XML 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<resource name="data" type="application/dictionary+xml">
<schema>
    <import href="tobefound.xml"/>
</schema>
</resource>

到目前为止我的代码是

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;

my $name = $ARGV[1];
my $dom = XML::LibXML->load_xml(location => $name);
my @node= $dom->findnodes('//import');
print "List: @node\n";

请告诉我是否有一种方法可以只找到一个特定的节点而无需遍历整个 dom 并且不必将其存储为列表。谢谢。

XML 不保证唯一性,因此任何类型的搜索都会 return 一个结果列表。该列表的长度可能为 0 或 1,就像 grep.

但简单的答案是只获取第一个结果:

my ($node) = $dom -> findnodes('//import');

否则 - 在您的 xpath 中指定:

my ( $node ) = $dom -> findnodes ( '(//import)[1]' ); 

恐怕我不知道当 'enough' 个节点被选中时,后者是否真的会退出。

getChildrenByTagName是Element节点的方法,不是Document节点。

my $doc = XML::LibXML->load_xml(location => $name);
my $root_ele = $doc->documentElement();
my ($import_ele) = $root_ele->getChildrenByTagName('import');

您也可以使用 XPath,尽管等效的 XPath 是 import(搜索子代),而不是 //import(搜索后代)。

my $doc = XML::LibXML->load_xml(location => $name);
my ($import_ele) = $doc->findnodes('import');

这returns所有import个节点并保留第一个。但是可以告诉搜索找到第一个后停止查找如下:

my $doc = XML::LibXML->load_xml(location => $name);
my ($import_ele) = $doc->findnodes('import[1]');  # Short for 'import[position()=1]'