2015-02-20 6 views
5

का उपयोग कर एक्सएमएल नोड सामग्री को प्रतिस्थापित करने के लिए मैं एक XML दस्तावेज़ को पढ़ने के लिए रूबी का उपयोग कर रहा हूं और एक नया मान के साथ, यदि यह मौजूद है, तो एक नोड अपडेट करें।नोकोगिरी

http://www.nokogiri.org/tutorials/modifying_an_html_xml_document.html मुझे स्पष्ट नहीं है कि नोड डेटा को कैसे बदला जाए, इसे अकेले फ़ाइल में कैसे सहेजना है।

<?xml version="1.0" encoding="utf-8"> 
    <my_id>123</my_id> 
    <Route> 
     <To> 
     <Node> 
      <Filename>file1.txt</Filename> 
      <Filename>file2.mp3</Filename> 
      <Filename>file3.doc</Filename> 
      <Filename>file4.php</Filename> 
      <Filename>file5.jpg</Filename> 
     </Node> 
     </To> 
    </Route> 
</xml> 

मैं "file3.doc" से "file3_new.html" बदलना चाहते हैं:

def ammend_parent_xml(folder, target_file, new_file) 
    # open parent XML file that contains file reference 
    get_xml_files = Dir.glob("#{@target_folder}/#{folder}/*.xml").sort.select {|f| !File.directory? f} 
    get_xml_files.each { |xml| 

    f  = File.open(xml) 

    # Use Nokgiri to read the file into an XML object 
    doc  = Nokogiri::XML(f) 
    filename = doc.xpath('//Route//To//Node//FileName') 

    filename.each_with_index { 
     |fl, i| 
     if target_file == fl.text 
     # we found the file, now rename it to new_file 
     # ??????? 
     end 

    } 

    } 

end 

यह कुछ उदाहरण एक्सएमएल है।

मैं कहेंगे:

def ammend_parent_xml("folder_location", "file3.doc", "file3_new.html") 

उत्तर

3
def amend_parent_xml(folder, target_file, new_file) 
    Dir["#{@target_folder}/#{folder}/*.xml"] 
    .sort.select{|f| !File.directory? f } 
    .each do |xml_file| 
    doc = Nokogiri.XML(File.read(xml_file)) 
    if file = doc.at("//Route//To//Node//Filename[.='#{target_file}']") 
     file.content = new_file # set the text of the node 
     File.open(xml_file,'w'){ |f| f<<doc } 
     break 
    end 
    end 
end 

सुधार::

  • उपयोग File.read बजाय File.open ताकि आप एक फ़ाइल खुला संभाल नहीं छोड़ते

    तो मैं के साथ सामग्री को अद्यतन करेगा।

  • सही टेक्स्ट मान के साथ नोड की तलाश करके सिंगल मिलान नोड को खोजने के लिए एक XPath अभिव्यक्ति का उपयोग करता है।
    • वैकल्पिक रूप से आप सभी फ़ाइलों को मिल सकता है और उसके बाद if file=files.find{ |f| f.text==target_file }
  • एक Nokogiri::XML::Document वापस डिस्क पर क्रमानुसार करने के लिए कैसे दिखाता है।
  • फ़ाइलों को प्रोसेस करने से बाहर निकलता है जैसे ही यह एक मेल खाने वाली एक्सएमएल फ़ाइल पाता है।
+1

ओएमजी को कुछ और जानकारी जोड़ा, सोमवार को काम करने का एक शानदार तरीका .. यह बहुत अच्छा है और अब मैं नोकोगिरी कैसे काम करता हूं इस पर थोड़ा और अधिक उलझन में हूं !! (और मुझे पता है कि अब संशोधन कैसे करें: पी) – Beertastic

2

एक्सएमएल में एक तत्व को बदलने के लिए:

file = File.new("xml_file.xml", "wb") 
file.write(@doc) 
file.close 

कुछ चीजें अपने नमूने के साथ गलत क्या है:

@doc = Nokogiri::XML::DocumentFragment.parse <<-EOXML 
<body> 
    <h1>OLD_CONTENT</h1> 
    <div>blah</div> 
</body> 
EOXML 


h1 = @doc.at_xpath "body/h1" 
h1.content = "NEW_CONTENT" 

puts @doc.to_xml #h1 will be NEW_CONTENT 

एक्सएमएल बचाने के लिए एक्सएमएल।

  • दो जड़ तत्वों my_id और Route
  • वहाँ एक पहले टैग में ? लापता
  • आप अंतिम पंक्ति </xml> की ज़रूरत है है कर रहे हैं?

नमूना फिक्सिंग बाद मैं Phrogz द्वारा उदाहरण का उपयोग करके तत्व प्राप्त करने में सक्षम था:

element = @doc.xpath("Route//To//Node//Filename[.='#{target_file}']").first 

नोट .first क्योंकि यह एक nodeset वापस आ जाएगी।

element.content = "foobar" 
+0

ठीक है .. मेरे उदाहरण में हालांकि, आपका कोड कैसे पता चलता है // रूट // // // // नोड // फ़ाइल नाम अपडेट करने के लिए ... मेरे एक्सएमएल में कई हैं, यही कारण है कि मैं लूपिंग कर रहा हूं उनके माध्यम से सभी – Beertastic

+0

यदि आप किसी XML दस्तावेज़ में कोई विशेष तत्व ढूंढ रहे हैं तो मैं xpath का उपयोग करूंगा।क्या आप एक उदाहरण xml दस्तावेज़ पोस्ट कर सकते हैं? – jmccure

+0

जोड़ा गया एक्सएमएल नमूना मूल प्रश्न .. अच्छा विचार! – Beertastic

संबंधित मुद्दे