3

XML ファイル内のすべての要素<HeadA>と要素を繰り返し処理し、それぞれに一意の ID を追加したいと考えています。<HeadB>これまでに試したアプローチは次のとおりです。

@xml.each_element('//HeadA | //HeadB') do |heading|
  #add a new id
end

問題は、XPath からのノードセット//HeadA | //HeadBがすべてHeadAs の後にすべて s が続くことHeadBです。私が必要としているのは、ドキュメントに表示される順序ですべてHeadAの とを並べたリストです。HeadB

明確にするために、私の XML は次のようになります。

<Doc>
  <HeadA>First HeadA</HeadA>
  <HeadB>First HeadB</HeadB>
  <HeadA>Second HeadA</HeadA>
  <HeadB>Second HeadB</HeadB>
</Doc>

そして、XPathから得ているのは次のとおりです。

  <HeadA>First HeadA</HeadA>
  <HeadA>Second HeadA</HeadA>
  <HeadB>First HeadB</HeadB>
  <HeadB>Second HeadB</HeadB>

私が取得する必要があるのは、順番にノードである場合:

  <HeadA>First HeadA</HeadA>
  <HeadB>First HeadB</HeadB>
  <HeadA>Second HeadA</HeadA>
  <HeadB>Second HeadB</HeadB>

IDを順番に追加できます。

4

4 に答える 4

1

わかりました、2回目の試行ですが、今回はうまくいったと思います:P

@xml.each_element('//*[self::HeadA or self::HeadB]') do |heading|
  puts heading.text
end
于 2010-11-15T14:38:08.643 に答える
1

Nokogiri を使用して XML を解析する:

xml = %q{
<Doc>
    <HeadA>First HeadA</HeadA>
    <HeadB>First HeadB</HeadB>
    <HeadA>Second HeadA</HeadA>
    <HeadB>Second HeadB</HeadB>
</Doc>
}

doc = Nokogiri::XML(xml)
doc.search('//HeadA | //HeadB').map{ |n| n.inner_text } #=> ["First HeadA", "First HeadB", "Second HeadA", "Second HeadB"]

あなたの仕事のためmapに、eachまたはeach_with_indexに置き換えることができ、ほぼ完了です。一意の ID を挿入するコードを追加するだけです。

于 2010-11-15T15:33:30.027 に答える
0

私は迅速で汚い解決策を思いつきました:

as_string = @xml.to_s
counter = 0
as_string.gsub!(/(<HeadA>|<HeadB>)/) do |str|
  result = str.sub '>', " id='#{counter}'>"
  counter += 1
  result
end
@xml = REXML::Document.new as_string

おそらく最もきれいでも最も効率的でもありませんが、私がやりたかったことは実行します。

編集: DD-Doug のアドバイスを受けて、次のようになりました。

counter = 0
@xml.each_element('//[self::HeadA or self::HeadB]') do |heading|
  heading.attributes['id'] = "id%03d" % counter
  counter += 1
end

これははるかに優れています。

于 2010-11-15T14:14:29.260 に答える
0

すべての HeadA をループし、各 HeadA 内で各 HeadB をループするとうまくいきますか?

@xml.each_element("//HeadA") do |headA|
  #do stuff to headA
  headA.each_element("HeadB") do |headB|
    #do stuff to headB
  end
end
于 2010-11-15T13:57:22.687 に答える