6

PerlのXML::LibXMLパッケージで名前空間を理解/使用するのに問題があります。要素には正常にアクセスできますが、属性にはアクセスできません。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');   

次に、common-nameという要素と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は何をしますか?私はそれが配列であり、属性は複数存在する可能性があるため配列に入れる必要があると思いますが、要素(共通名など)は1つだけである必要があるため、そうすべきではありませんか?

私はここの例に従ってきました: http: //www.xml.com/pub/a/2001/11/14/xml-libxml.html そしてここ:http://perl-xml.sourceforge.net/faq /#namespaces_xpath、そして彼らのサンプルのラクダスクリプトを私の名前空間で動作させようとしているので、奇妙な名前空間です。

4

1 に答える 1

7

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
于 2010-01-11T00:00:29.930 に答える