2016-10-01 13 views
5

के भीतर नोकोगिरी और ऊपरी पूर्वजों नोड का उपयोग करके एकाधिक नोड्स का चयन करना पिछले दिन मैं पूर्वजों नोड में एक संदर्भ चर के अधीन नोकोगिरी का उपयोग करके एकाधिक नोड्स प्राप्त करने के लिए किसी भी समाधान की खोज कर रहा था।एक परिवर्तनीय

मुझे क्या चाहिए: असल में मैं "सेगमेंट" नोड के सभी "आईडी" एकत्र कर रहा हूं। फिर मैं "सेगमेंट" नोड के साथ आने वाले सभी "संसाधन" को एकत्र करना चाहता हूं। "संसाधन" एकत्र करने के लिए मैं एक चर के रूप में "आईडी" सेट करना चाहता हूं।

<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" सब एकत्रित "पर संसाधन "

मैं बाद के संसाधनों को वास्तव में कैसे आवंटित कर सकता हूं प्रत्येक सेगमेंट आईडी एक चर के रूप में?

मैं इस कोड का इस्तेमाल किया था, लेकिन पाश खाली है, क्योंकि 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 

सभी नोड्स नहीं attribues, आईडी, वर्ग, आदि

तुम मुझे मेरी समस्या के साथ मदद कर सकते हैं हो सकता है। सबसे पहले मैं आपके समर्थन के लिए विनम्रता से धन्यवाद दूंगा!

अद्यतन 10/07/16

मैं भी संसाधनों पर "प्रत्येक करना" के लिए निम्नलिखित भाव के साथ कोड चला:

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| 

ही नहीं मिला

,210

और एक "अगर" शर्त, यह भी एक ही समस्या के साथ:

if cpl.at("Segment/Id:contains(\"#{cpl_segment_list_uuid}\")").each do|f| 
#some code 
end 

अद्यतन 2016/18/10

असल में मैं संसाधन (4) की सही संख्या मिलता है, लेकिन अभी भी प्रत्येक सेगमेंट के लिए अलग नहीं है। तो प्रत्येक सेगमेंट में वही चार संसाधन हैं।

मुझे सभी संसाधनों की दोहरी संख्या क्यों नहीं मिलती है, कि मैं "सेगमेंट" -लूप में सरणी बना देता हूं।

#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 

मुझे आशा है कि मेरे अद्यतन आपको और अधिक जानकारी दे देंगे:

यह वर्तमान कोड है। आपकी मदद और उत्तर के लिए बहुत बहुत धन्यवाद!

अद्यतन 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 

अब मैं प्रत्येक अद्वितीय अनुक्रम के तहत सभी अलग "संसाधन" प्राप्त करना चाहते हैं: अब मैं खंडों के तहत प्रत्येक क्रम पर एक और पाश की है। मुझे सभी अलग-अलग संसाधनों को सूचीबद्ध करना होगा और एकत्रित मूल्यों में से कुछ को जोड़ना होगा।

क्या प्रत्येक संसाधन को "अनुक्रम आईडी" के तहत अलग-अलग मानों (उप नोड्स) के साथ एकत्र करने का कोई तरीका है? फिलहाल, मुझे किसी भी समाधान के लिए कोई जानकारी नहीं है .... इसलिए कोई कोड नहीं है जो मैं आपको दिखा सकता हूं, जो भागों में काम करेगा।

"संसाधन" लूप के लिए प्रत्येक_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 
संबंधित मुद्दे