我有一个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]'