2009-08-13 9 views
14

का उपयोग कर एक्सएमएल नोड्स और तत्वों को सम्मिलित करना और हटाना, मैं एक एक्सएमएल फ़ाइल के हिस्सों को निकालना चाहता हूं और एक नोट बना सकता हूं कि मैंने उस फ़ाइल में कुछ हिस्सा निकाला है, जैसे कि "यहां कुछ निकाला गया था"।नोकोगिरी

मैं Nokogiri के साथ ऐसा करने की कोशिश कर रहा हूँ, लेकिन यह वास्तव में कैसे करने के लिए पर दर्ज नहीं किया जा रहा है:

  1. एक <Nokogiri::XML::Element>
  2. परिवर्तन के सभी बच्चे कि पूरा तत्व की inner_text हटाना

कोई सुराग?

+0

Nokogiri के [एक HTML/XML में संशोधन के लिए ट्यूटोरियल:

doc.at('food').content = 'REMOVED' doc.at('food').to_xml # => "<food>REMOVED</food>" 

तुम भी बजाय एक XML टिप्पणी इस्तेमाल कर सकते हैं दस्तावेज़] (http://nokogiri.org/tutorials/modifying_an_html_xml_document.html) इसे कवर करें। इसके अलावा 'node.unlink' इसे एक डोम से हटा देगा। –

+0

"[पूछें]" देखें। जैसा कि, इसमें महत्वपूर्ण जानकारी की कमी है जैसे इनपुट और अपेक्षित आउटपुट के लिए न्यूनतम XML उदाहरण, साथ ही कोड को हल करने के लिए लिखा गया कोड। –

उत्तर

3

आप इस तरह यह कर सकते हैं:

doc=Nokogiri::XML(your_document) 
note=doc.search("note") # find all tags with the node_name "note" 
note.remove 

कि <note> टैग के भीतर सभी बच्चों को दूर करेंगे, मुझे यकीन है कि कैसे सभी टिप्पणी तत्वों की "inner_text बदलने" के लिए नहीं कर रहा हूँ। मुझे लगता है कि inner_text एक नोकोगिरी :: एक्सएमएल :: एलिमेंट के लिए लागू नहीं है।

14

नोकोगिरी यह बहुत आसान बनाता है। एक उदाहरण के रूप this document का उपयोग करना, निम्नलिखित कोड सभी vitamins टैग मिलेगा, अपने बच्चों को (और बच्चों के बच्चों, आदि) को हटा दें, और उनके भीतर पाठ कहने के लिए बदल "बच्चों को हटा दिया।":

require 'nokogiri' 

io = File.open('sample.xml', 'r') 
doc = Nokogiri::XML(io) 
io.close 

doc.search('//vitamins').each do |node| 
    node.children.remove 
    node.content = 'Children removed.' 
end 

एक दिया गया

<food> 
    <name>Avocado Dip</name> 
    <mfr>Sunnydale</mfr> 
    <serving units="g">29</serving> 
    <calories total="110" fat="100"/> 
    <total-fat>11</total-fat> 
    <saturated-fat>3</saturated-fat> 
    <cholesterol>5</cholesterol> 
    <sodium>210</sodium> 
    <carb>2</carb> 
    <fiber>0</fiber> 
    <protein>1</protein> 
    <vitamins> 
     <a>0</a> 
     <c>0</c> 
    </vitamins> 
    <minerals> 
     <ca>0</ca> 
     <fe>0</fe> 
    </minerals> 
</food> 
इस के लिए

: food नोड इस तरह देखने से जाना होगा

<food> 
    <name>Avocado Dip</name> 
    <mfr>Sunnydale</mfr> 
    <serving units="g">29</serving> 
    <calories total="110" fat="100"/> 
    <total-fat>11</total-fat> 
    <saturated-fat>3</saturated-fat> 
    <cholesterol>5</cholesterol> 
    <sodium>210</sodium> 
    <carb>2</carb> 
    <fiber>0</fiber> 
    <protein>1</protein> 
    <vitamins>Children removed.</vitamins> 
    <minerals> 
     <ca>0</ca> 
     <fe>0</fe> 
    </minerals> 
</food> 
3

पिछले Nokogiri उदाहरण मुझे आर में सेट ight दिशा, लेकिन doc.search का उपयोग कर एक विकृत //vitamins छोड़ दिया, तो मैं सीएसएस इस्तेमाल किया:

require "rubygems" 
require "nokogiri" 

f = File.open("food.xml") 
doc = Nokogiri::XML(f) 

doc.css("food vitamins").each do |node| 
    puts "\r\n[debug] Before: vitamins= \r\n#{node}" 
    node.children.remove 
    node.content = "Children removed" 
    puts "\r\n[debug] After: vitamins=\r\n#{node}" 
end 
f.close 

कौन सा में परिणाम:

debug] Before: vitamins= 
<vitamins> 
     <a>0</a> 
     <c>0</c> 
    </vitamins> 

[debug] After: vitamins= 
<vitamins>Children removed</vitamins> 
2

यहाँ मैं क्या चाहते हैं:

पहले कुछ एक्सएमएल पार्स करें:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<?xml version="1.0"?> 
<?xml-stylesheet type="text/css" href="nutrition.css"?> 
<nutrition> 

    <daily-values> 
    <total-fat units="g">65</total-fat> 
    <saturated-fat units="g">20</saturated-fat> 
    <cholesterol units="mg">300</cholesterol> 
    <sodium units="mg">2400</sodium> 
    <carb units="g">300</carb> 
    <fiber units="g">25</fiber> 
    <protein units="g">50</protein> 
    </daily-values> 

    <food> 
    <name>Avocado Dip</name> 
    <mfr>Sunnydale</mfr> 
    <serving units="g">29</serving> 
    <calories total="110" fat="100"/> 
    <total-fat>11</total-fat> 
    <saturated-fat>3</saturated-fat> 
    <cholesterol>5</cholesterol> 
    <sodium>210</sodium> 
    <carb>2</carb> 
    <fiber>0</fiber> 
    <protein>1</protein> 
    <vitamins> 
     <a>0</a> 
     <c>0</c> 
    </vitamins> 
    <minerals> 
     <ca>0</ca> 
     <fe>0</fe> 
    </minerals> 
    </food> 

</nutrition> 
EOT 

अगर मैं नोड की सामग्री को हटाना चाहता हूं, तो मैं rem ove अपने children या इसकी सामग्री के लिए नहीं के बराबर आवंटित:

doc.at('total-fat').to_xml # => "<total-fat units=\"g\">65</total-fat>" 
doc.at('total-fat').children.remove 
doc.at('total-fat').to_xml # => "<total-fat units=\"g\"/>" 

या:

doc.at('saturated-fat').to_xml # => "<saturated-fat units=\"g\">20</saturated-fat>" 
doc.at('saturated-fat').content = nil 
doc.at('saturated-fat').to_xml # => "<saturated-fat units=\"g\"/>" 

मैं किसी और तरीके से उपयोग के लिए एक नोड से पाठ निकाल करना चाहते हैं:

food = doc.at('food').text 
# => "\n Avocado Dip\n Sunnydale\n 29\n \n 11\n 3\n 5\n 210\n 2\n 0\n 1\n \n  0\n  0\n \n \n  0\n  0\n \n " 

या :

food = doc.at('food').children.map(&:text) 
# => ["\n ", 
#  "Avocado Dip", 
#  "\n ", 
#  "Sunnydale", 
#  "\n ", 
#  "29", 
#  "\n ", 
#  "", 
#  "\n ", 
#  "11", 
#  "\n ", 
#  "3", 
#  "\n ", 
#  "5", 
#  "\n ", 
#  "210", 
#  "\n ", 
#  "2", 
#  "\n ", 
#  "0", 
#  "\n ", 
#  "1", 
#  "\n ", 
#  "\n  0\n  0\n ", 
#  "\n ", 
#  "\n  0\n  0\n ", 
#  "\n "] 

या फिर भी आप पाठ को उलझाना चाहते हैं।

और, यदि आप चिह्नित करने के लिए है कि आप पाठ हटा दिया है चाहता हूँ:

doc.at('food').children = '<!-- REMOVED -->' 
doc.at('food').to_xml # => "<food>\n <!-- REMOVED -->\n</food>" 
संबंधित मुद्दे