最後に、Nokogiriを使用して複数のノードを取得するための解決策を探していました。変数内でNokogiriと上位祖先ノードを使用して複数のノードを選択する
必要なもの: 実際には、「セグメント」ノードのすべての「ID」を収集しています。次に、「セグメント」ノードを使用して、後続のすべての「リソース」を収集したいと思います。 "リソース"を収集するために、私は変数として "ID"を設定したいと思います。 「すべて "SegmentId" sがすべてを集める現時点で
A = 48000.0
B = 240000.0
C = 0.0
D = 240000.0
Some functions to calculate an average on the resources.
puts all_arry
A = 5.0
B = 5.0
C = 5.0
D = 5.0
A = 5.0
B = 5.0
C = 5.0
D = 5.0
=8 values -> only 4 values existing for the exact loop (2 average values per Segment)
:
<CPL>
<SegmL>
<Segment>
<Id>UUID</Id> #UUID as a variable
<Name>name_01</Name>
<SeqL>
<ImageSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource> #depending on SegmentId
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</ImageSequence>
<AudioSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource>
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</AudioSequence>
</SequL>
</Segment>
<Segment>
<Id>UUIDa</Id>
<Name>name_02</Name>
<SequL>
<ImageSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource>
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</ImageSequence>
<AudioSequence>
<Id>UUID</Id>
<Track>UUID</Track>
<ResourceList>
<Resource>
<A>aaa</A>
<B>bbb</B>
<C>ccc</C>
<D>ddd</D>
</Resource>
</ResourceList>
</AudioSequence>
</SequL>
</Segment>
</SegmL>
</CPL>
すべてのリソースデータのそれぞれがA = Resource.css("A").text.gsub(/\n/,"")
#first each do
cpls.each_with_index do |(cpl_uuid, mycpl), index|
cpl_filename = mycpl
cpl_file = File.open("#{resource_uri}/#{cpl_filename}")
cpl = Nokogiri::XML(cpl_file).remove_namespaces!
#get UUID for UUID checks
cpl_uuid = cpl.css("Id").first.text.gsub(/\n/,"")
cpl_root_edit_rate = cpl.css("EditRate").first.text.gsub(/\s+/, "\/")
#second each do
cpl.css("Segment").each do |s| # loop segment
cpl_segment_list_uuid = s.css("Id").first.text.gsub(/\n/,"") #uuid of segment list
#third each do
cpl.css("Resource").each do |f| #loop resources
cpl_A = f.css("A").text.gsub(/\n/,"") # uuid of A
cpl_B = f.css("B").text.gsub(/\n/,"") # uuid of B
end #third
end #second
end #first
で収集私の表現は私に配列に格納されたこれらの情報を提供しますリソース "
次のリソースを正確に割り当てる方法セグメントIDを変数として使用しますか? ...
私はこのコードを使用していたが、ループがあるため、「セグメント」の「ID」および各「リソース」「A」、「B」betwerrnいくつかのより多くのノードを考えて、空である:
if cpl.at("Segment/Id:contains(\"#{cpl_segment_list_uuid}\")")
cpl.css("Resource").each do |f|
#collecting resources here for each segmet
end
end
すべてのノードは、あなたは私の問題で私を助けることができるかもしれNO attribues、IDS、クラス、など
を持っていません。まず、私は政治的にあなたのサポートに感謝します!
expression = "/SegmetList/Segment[Id>cpl_segment_list_uuid]"
cpl.xpath(expression).each do |f|
それは「それぞれが行う」実行されます。私も、リソース上で「それぞれがやる」に対して次の式でコードを実行しなかった
UPDATE 10/07/16
が、私は以前のように
cpl.css("Segment:contains(\"#{cpl_segment_list_uuid}\") > Resource").each do |f|
同じ内部ノードを取得していない
そして、 "もし" -condition、また同じ問題に:
if cpl.at("Segment/Id:contains(\"#{cpl_segment_list_uuid}\")").each do|f|
#some code
end
UPDATE 2016/18/10
実際に私は、資源(4)の右の数を取得するが、それでもセグメントごとに分離されていない。したがって、各セグメントには同じ4つのリソースがあります。
なぜ私はすべてのリソースの倍数が得られないのですか、私は "Segment" -loopで配列を作成します。私は私の更新はあなたの詳細を与えることを願っています
#first each do
cpls.each_with_index do |(cpl_uuid, mycpl), index|
cpl_filename = mycpl
cpl_file = File.open("#{resource_uri}/#{cpl_filename}")
cpl = Nokogiri::XML(cpl_file).remove_namespaces!
#get UUID for UUID checks
cpl_uuid = cpl.css("Id").first.text.gsub(/\n/,"")
cpl_root_edit_rate = cpl.css("EditRate").first.text.gsub(/\s+/, "\/")
#second each do
cpl.css("Segment").each do |s| # loop segment
cpl_segment_list_uuid = s.css("Id").first.text.gsub(/\n/,"") #uuid of segment list
array_for_resource_data = Array.new
#third each do
s.css("Resource").each do |f| #loop resources #all resources
s.search('//A | //B').each do |f| #selecting only resources "A" and "B"
cpl_A = f.css("A").text.gsub(/\n/,"") # uuid of A
cpl_B = f.css("B").text.gsub(/\n/,"") # uuid of B
end #third
end #second
end #first
:
これは、現在のコードです。ご協力いただきありがとうございます!
UPDATE 2016/31/10
セグメントの二重出力が固定されると問題。
cpl.css("Segment").each do |u|
segment_list_uuid = u.css("Id").first.text.gsub(/\n/,"")
sequence_list_uuid_arr = Array.new
u.xpath("//SequenceList[//*[starts-with(name(),'Sequence')]]").each do |s|
sequence_list_uuid = s.css("TrackId").first.text#.gsub(/\n/,"")
sequence_list_uuid_arr.push(cpl_sequence_list_uuid)
#following some resource nodes
s.css("Resource").each do |f|
asset_uuid = f.css("TrackFileId").text.gsub(/\n/,"")
resource_uuid = f.css("Id").text.gsub(/\n/,"")
edit_rate = f.css("EditRate").text.gsub(/\s+/, "\/")
#some more code
end #resource
end #sequence list
end #segment
ここで、それぞれのユニークなシーケンスの下にあるすべての異なる "リソース"を取得したいと思います。私はすべての異なるリソースをリストし、収集された値のいくつかをまとめなければなりません。
同じ "シーケンスID"の下で異なる値(サブノード)を持つ各リソースを収集する方法はありますか?現時点では、私は何の解決策も考えていないので、私はあなたに示すことができるコードはありません。
"リソース"ループのeach_with_indexは機能しません。
新しい問題を解決するためのアイデアやアプローチがありますか?