2016-10-01 38 views
5

最後幾天,我在尋找任何解決方案來獲取使用Nokogiri的多個節點,並將其作爲祖先節點中的引用變量的對象。在變量中使用Nokogiri和上一級祖先節點選擇多個節點

我需要的是: 其實我正在收集「Segment」節點的所有「Id」。然後我想收集所有後續的「資源」與「Segment」節點。爲了收集「資源」,我想將「Id」設置爲一個變量。

<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 

我的表達收集給我的這些信息存儲在一個數組:

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) 

目前所有的 「SegmentId」 S收集所有「資源「

我該如何準確地分配後續資源每個分段ID作爲變量?

我用這個代碼,但環是空的,因爲betwerrn了「段」,「ID」,每個「資源」,「A」,「B」有些多個節點的思考...:

if cpl.at("Segment/Id:contains(\"#{cpl_segment_list_uuid}\")") 
    cpl.css("Resource").each do |f| 
     #collecting resources here for each segmet 
    end 
end 

所有節點都沒有attribues,IDS類等

願你能幫助我與我的問題。首先我會在政治上感謝你的支持!

UPDATE 16年10月7日

我還對運行資源利用下列表達式的代碼爲「每一個做」:

expression = "/SegmetList/Segment[Id>cpl_segment_list_uuid]" 
cpl.xpath(expression).each do |f| 

它運行「每做」 ,但我沒有得到內部節點

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)的權數,但仍沒有爲每個細分市場。所以每個細分市場都有相同的四個資源。

爲什麼我沒有得到所有資源的雙倍數,我在「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

嘗試

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

.//將停泊在當前元素的XPath查詢,而不是搜索整個文檔。

elem = doc.search('ImageSequence').first 
elem.search('//A') # returns all A in the whole document 
elem.search('.//A') # returns all A inside element