2016-10-01 3 views
5

最後に、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は機能しません。

新しい問題を解決するためのアイデアやアプローチがありますか?

答えて

0

ではなくドキュメント全体を検索するよりも、現在の要素でXPathクエリを固定します

resource.search('.//A | .//B') 

.//を試してみてください。

elem = doc.search('ImageSequence').first 
elem.search('//A') # returns all A in the whole document 
elem.search('.//A') # returns all A inside element 
関連する問題