1

次の形式のドキュメントの XML 表現があります。

<response>
  <paragraph>
    <sentence id="1">Hey</sentence>
    <sentence id="2">Hello</sentence>
  </paragraph>
</response>

XML::LibXML を使用してドキュメントを解析し、文の位置を取得しようとしています。

my $root_node = XML::LibXML->load_xml( ... )->documentElement;
foreach my $sentence_node ( $root_node->findnodes('//sentence')->get_nodelist ){
  print $sentence_node->find( 'position()' );
}

私が得るエラーは「XPathエラー:無効なコンテキスト位置エラー」です。私はドキュメントを読んで、この興味深い一口を見つけました

初期コンテキストで XPath 関数 position() を評価すると、XPath エラーが発生します

私の問題は、この情報をどう処理すればよいかわからないことです。「初期コンテキスト」とは何ですか? エンジンがコンテキストの位置を自動的に追跡するようにするにはどうすればよいですか?


Re: @ダン

答えに感謝します。あなたの例を試してみましたが、うまくいきました。私のコードでは、コンテキストが perl 変数によって表されるノードであると想定していました。だから、 $sentence->find( 'position()' ) './position()' になりたかった。実際の例を見たにもかかわらず、私はまだできません

foreach my $sentence ...
  my $id = $sentence->getAttribute('id');
  print $root_node->findvalue( '//sentence[@id=' . "$id]/position()");

しかし、私はすることができます

$root_node->findvalue( '//sentence[@id=' . "$id]/text()");

position() は、あなたのようなクエリを制限するためにのみ使用できますか?

4

1 に答える 1

2

position()LibXMLで動作します。たとえば、を参照してください

my $root_node = $doc->documentElement;
foreach my $sentence_node ( $root_node->findnodes('//sentence[position()=2]')->get_nodelist ){
  print $sentence_node->textContent;
}

Helloこれにより、サンプルデータが印刷されます。

しかし、ここでの使用方法には、コンテキストはありません。それぞれについてsentence_node、あなたは何に対してその位置が欲しいですか?

位置で特定のノードを探している場合は、上記のようなセレクターを使用します。これが最も簡単です。

于 2010-04-27T21:46:57.427 に答える