6

次のような単純なxmlファイルがあります。

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<microplateDoc xmlns="http://moleculardevices.com/microplateML">
<camelids>
  <species name="Camelus bactrianus">
    <common-name>Bactrian Camel</common-name>
    <physical-characteristics>
      <mass>450 to 500 kg.</mass>
      <appearance>
  Blah blah blah
   </appearance>
    </physical-characteristics>   
  </species>
  </camelids>
 </microplateDoc>   

次のperlスクリプトで種名を読み取ろうとしています:

use XML::LibXML;

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/johncumbers/Documents/7_Scripts/Perl/XML_to_MySQL/simplified_camelids.xml');
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement()  );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');

#loop through to find species nodes
my @n = $xc->findnodes('*/species');  #was */species
foreach $nod (@n) {
    print "A: ".$nod->getAttribute("name")."\n";
    my @c = $nod->findnodes('./common-name');
    }

しかし、ノードを見つけることができません。うまくいかない理由を教えてください。これを自分で試してトラブルシューティングできるように、perl 関数を検索するのに最適な Web サイトは何ですか? 現時点での出力は何もないため、スクリプトに何をしているのかを教えてもらうにはどうすればよいですか。どうもありがとう。

4

1 に答える 1

5

名前空間プレフィックスをドキュメントに関連付けましたが、XPath構文でそれが使用されていません。

my @n = $xc->findnodes('//ns:species');

仕事をするべきです。

プレフィックスがないと一致しません。また、*/speciesパスは現在のコンテキスト (つまり、ドキュメントのトップ レベル) の子にのみ一致します。を使用//speciesすると、ドキュメント内のすべてのspecies要素が検索されます。それがうまくいかない場合 (要素が、一致させたくないドキュメント内の他のコンテキストに表示されるため) を使用します。

/*/*/ns:species

要素は最上位の「ひ孫」であるためです。

もう 1 つのXPath参照。

于 2010-01-17T00:24:33.433 に答える