0

このサンプル XML ファイルを解析しようとしています。

<Collection version="2.0" id="74j5hc4je3b9">
  <Name>A Funfair in Bangkok</Name>
  <PermaLink>Funfair in Bangkok</PermaLink>
  <PermaLinkIsName>True</PermaLinkIsName>
  <Description>A small funfair near On Nut in Bangkok.</Description>
  <Date>2009-08-03T00:00:00</Date>
  <IsHidden>False</IsHidden>
  <Items>
    <Item filename="AGC_1998.jpg">
      <Title>Funfair in Bangkok</Title>
      <Caption>A small funfair near On Nut in Bangkok.</Caption>
      <Authors>Anthony Bouch</Authors>
      <Copyright>Copyright © Anthony Bouch</Copyright>
      <CreatedDate>2009-08-07T19:22:08</CreatedDate>
      <Keywords>
        <Keyword>Funfair</Keyword>
        <Keyword>Bangkok</Keyword>
        <Keyword>Thailand</Keyword>
      </Keywords>
      <ThumbnailSize width="133" height="200" />
      <PreviewSize width="532" height="800" />
      <OriginalSize width="2279" height="3425" />
    </Item>
    <Item filename="AGC_1164.jpg" iscover="True">
      <Title>Bumper Cars at a Funfair in Bangkok</Title>
      <Caption>Bumper cars at a small funfair near On Nut in Bangkok.</Caption>
      <Authors>Anthony Bouch</Authors>
      <Copyright>Copyright © Anthony Bouch</Copyright>
      <CreatedDate>2009-08-03T22:08:24</CreatedDate>
      <Keywords>
        <Keyword>Bumper Cars</Keyword>
        <Keyword>Funfair</Keyword>
        <Keyword>Bangkok</Keyword>
        <Keyword>Thailand</Keyword>
      </Keywords>
      <ThumbnailSize width="200" height="133" />
      <PreviewSize width="800" height="532" />
      <OriginalSize width="3725" height="2479" />
    </Item>
  </Items>
</Collection>

これが私の現在のコードです:

require 'nokogiri'

doc = Nokogiri::XML(File.open("sample.xml"))
somevar = doc.css("collection")

#create loop
somevar.each do |item|
  puts "Item "
  puts item['Title']
  puts "\n"
end#items

XML ドキュメントのルートから始めて、ルートの「コレクション」から新しい各レベルに移動しようとしています。

ノード セットから開始し、ノードから情報を取得します。ノードには要素が含まれています。ノードを変数に割り当て、その下のすべてのレイヤーとテキストを抽出するにはどうすればよいですか?

以下のコードのようなことはできますが、ループを使用して XML のネストされた各要素を体系的に移動し、各行のデータを出力する方法を知りたいです。テキストの表示が終了したら、前の要素/ノードに戻るにはどうすればよいですか? (ツリー内のノードをトラバースする)

puts somevar.css("Keyworks Keyword").text
4

1 に答える 1

0

NokogiriNodeSetとNokogiriNodeは非常によく似た API をサポートしていますが、NodeSetのメソッドが含まれているすべてのノードで順番に動作する傾向があるという重要な意味上の違いがあります。たとえば、単一のノードchildrenはそのノードの子を取得しますが、 は含まれているすべてNodeSetのノードの子を取得しますchildren(ドキュメント内で発生する順序で)。したがって、すべてのアイテムのすべてのタイトルと作成者を印刷するには、次のようにします。

require 'nokogiri'

doc = Nokogiri::XML(File.open("sample.xml"))

coll = doc.css("Collection")

coll.css("Items").children.each do |item|
  title = item.css("Title")[0]
  authors = item.css("Authors")[0]
  puts title.content if title
  puts authors.content if authors
end

この方法で、ツリーの任意のレベルに到達できます。別の例 -- ツリー内のすべてのノードを出力する深さ優先検索 (注: ノードの出力表現には、その子の出力表現が含まれるため、出力は非常に長くなります):

def rec(node)
  puts node
  node.children.each do |child|
    rec child
  end
end

これについて具体的に尋ねるので、特定のノードの親を取得したい場合は、parentメソッドを使用できます。ただし、対象のサブツリーを含むに渡されるブロックeachなどに処理を入れることができれば、その必要はないかもしれません。NodeSet

于 2013-07-13T17:18:54.700 に答える