0

コンテキスト: libxml-ruby gem を使用して XML ファイルを解析しています。findXPathメソッドを使用して、一連のノードについて XML ドキュメントをクエリする必要があります。find次に、各ノードを個別に処理し、XPathメソッドを使用してもう一度クエリを実行する必要があります。

問題:返されたノードを個別にクエリしようとすると、XPathfindメソッドはノードだけでなくドキュメント全体をクエリしています。

コード例:

require 'xml'

string = %{<?xml version="1.0" encoding="iso-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>}

xml = XML::Parser.string(string, :encoding => XML::Encoding::ISO_8859_1).parse
books = xml.find("//book")
books.each do |book|
    price = book.find("//price").first.content
    puts price
end

このスクリプトは29.992 回戻ります。これは XPath コンテキストの設定と関係があるに違いないと思いますが、それを達成する方法はまだわかりません。

4

1 に答える 1

2

私が最初に目にする問題はbook.find("//price").

//priceは、「ドキュメントの上部から始めて下を見ることを意味します。これは、あなたがやりたいことではないことは間違いありません。代わりにbook、最初のprice.

Nokogiri を使用する場合、私は CSS セレクターを使用します。目に優しく、通常は同じことを達成できるからです。

require 'nokogiri'

string = %{<?xml version="1.0" encoding="iso-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>}

xml = Nokogiri::XML(string)
books = xml.search("book")
books.each do |book|
    price = book.at("price").content
    puts price
end

実行した後、次のようになります。

29.99
39.95
于 2013-06-12T23:19:41.890 に答える