如何从perl中的XML :: libxml访问属性和元素?
-
19-09-2019 - |
题
我很难理解 /使用名称空间 xml :: libxml perl包装。我可以成功访问元素,但不能访问属性。我有以下代码访问XML文件(http://pastebin.com/f3fb9d1d0).
my $tree = $parser->parse_file($file); # parses the file contents into the new libXML object.
my $xpc = XML::LibXML::XPathContext->new($tree);
$xpc->registerNs(microplateML => 'http://moleculardevices.com/microplateML');
然后,我尝试访问一个称为consion-name的元素和称为名称的属性。
foreach my $camelid ($xpc->findnodes('//microplateML:species')) {
my $latin_name = $camelid->findvalue('@name');
my $common_name = $camelid->findvalue('common-name');
print "$latin_name, $common_name" ;
}
但是只有拉丁名字(@name
)正在打印,常用名称不是。我在做什么错,我如何也可以打印出常用名称?
在这种情况下,@name做什么?我认为这是一个数组,应该将属性放入数组中,因为可能有一个以上的数组,但是元素(如常用名称)不应该是因为应该有一个?
我一直在这里遵循示例: http://www.xml.com/pub/a/a/2001/11/14/xml-libxml.html和这里: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, ,并试图使他们的示例骆驼脚本与我的名称空间一起使用,因此是怪异的名称空间。
解决方案
确保您的XML文件有效,然后使用 $node->getAttribute("someAttribute")
访问属性。
@name是一个属性名称。您将在FindNodes()中使用它来指定具有给定属性集的元素。例如。这样的路径:
//camelids/species[@name="Camelus bactrianus"]/
这是一个简单/人为的示例:
#!/usr/bin/perl -w
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/castle/Desktop/animal.xml');
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');
my @n = $xc->findnodes('//ns:species');
foreach $nod (@n) {
print "A: ".$nod->getAttribute("name")."\n";
my @c = $xc->findnodes("./ns:common-name", $nod);
foreach $cod (@c) {
print "B: ".$cod->nodeName;
print " = ";
print $cod->getFirstChild()->getData()."\n";
}
}
输出为:
perl ./xmltest.pl
A: Camelus bactrianus
B: common-name = Bactrian Camel
不隶属于 StackOverflow