XML:使用LibXML查找XML中的特定节点



我有一个XML文件,它只有一个名为import的节点。我想查找导入的href属性。我尝试使用findnodes((,但它返回了一个列表,我必须进一步搜索,所以我希望有一种方法可以找到一个只有一次出现的特定节点。我尝试了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: @noden";

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

XML不能保证唯一性,所以任何类型的搜索都会返回一个结果列表。这个列表的长度可能是0或1,就像grep一样。

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

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

如果失败,请在xpath:中指定

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

恐怕我不知道当选择了"足够多"的节点后,后者是否真的会退出。

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');

这将返回所有import节点,并保留第一个。但是可以告诉搜索停止寻找后的第一个如下:

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

相关内容

  • 没有找到相关文章

最新更新