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');
次に、Common-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, 、そして彼らの例のキャメルスクリプトを私の名前空間で動作させるために、奇妙な名前空間を取得しようとしています。
解決
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