2

Ruby 1.9.3p385、Nokogiri、xpath v.1 を使用しています。

Stackoverflow のすばらしい人々の助けを借りて、次の xpath 式を思いつきました。

products = xml_file.xpath("(/root_tag/middle_tag/item_tag")

この XML ファイルを分割するには:

<root_tag>
  <middle_tag>
    <item_tag>
      <headline_1>
        <tag_1>Product title 1</tag_1>
      </headline_1>
      <headline_2>
        <tag_2>Product attribute 1</tag_2>
      </headline_2>
    </item_tag>
    <item_tag>
      <headline_1>
        <tag_1>Product title 2</tag_1>
      </headline_1>
      <headline_2>
        <tag_2>Product attribute 2</tag_2>
      </headline_2>
    </item_tag>
  </middle_tag>
</root_tag>

2製品に。

ここで、各製品を調べて、すべての製品情報を (リーフ ノードを抽出することによって) 抽出したいと考えています。その目的のために、私はこのコードを使用しています:

products.each do |product|
  puts product #=> <item_tag><headline_1><tag_1>Product title 1</tag_1></headline_1><headline_2><tag_2>Product attribute 1</tag_2></headline_2></item_tag>
  product_data = product.xpath("//*[not(*)]")
  puts product_data #=> <tag_1>Product title 1</tag_1><tag_2>Product attribute 1</tag_2><tag_1>Product title 2</tag_1><tag_2>Product attribute 2</tag_2>
end

ご覧のとおり、これは私が望んでいることを正確に実行しますが、1 つのことを除いて、製品ではなく製品を読み取ります。

検索を製品のみに制限するにはどうすればよいですか? 回答の際は、例が簡略化されていることに注意してください。私は、ソリューションが製品の知識を「消去」することを望みます(可能であれば)。これは、おそらくすべての場合に機能するためです。

4

3 に答える 3

2

の代わりに:

//*[not(*)] 

使用:

(//product)[1]//*[not(*)] 

productこれにより、XML ドキュメントの最初の要素の下にある「リーフ ノード」のみが選択されます。

productドキュメント内のすべての要素に対してこれを繰り返します。次の方法でカウントを取得できます。

count(//product)
于 2013-03-31T16:13:56.253 に答える