2011-01-20 12 views
8

मैं अपने मूल लेआउट को संरक्षित करते समय मौजूदा एक्सएमएल फाइल को संपादित करना चाहता हूं। इसमें नई लाइनें, टिप्पणियां इत्यादि शामिल हैं। संपादन XML के अंदर तत्व ढूंढने और टेक्स्ट मान को संशोधित करने से बना है।ग्रोवी एक्सएमएल फ़ाइल संपादित करें, टिप्पणियां रखें, लाइन ब्रेक

मेरी पहली कोशिश XmlUtil.serialize के साथ XMLParser का उपयोग कर रही थी लेकिन यह आवश्यकता को पूरा नहीं करती है।

कोई भी XMLParser के किसी भी विकल्प से अवगत है जहां संपादन मूल XML स्ट्रिंग के "स्थान पर" हैं? यदि नहीं, तो शायद एक पुस्तकालय है जो XPath/GPath का उपयोग करके खोज करता है और केवल खोज के स्थान को वापस कर देता है ताकि मैं StringBuilder.replace कर सकूं।

संपादित:

अभी के लिए मैं एक्सएमएल नोड के स्ट्रिंग अनुक्रमणिका को खोजने के लिए (कि मैं xpath का उपयोग कर पा सकते हैं) तो मैं अनुक्रमित पर की जगह कर रहा हूँ इस समारोह बना दिया। सरल नोड्स के लिए ठीक काम करता है < नोड> मूल्य </नोड>:

def find_location_by_node(xmlString, root_xml, node) 
{ 
    current_index = 0; 

    for(current_node in root_xml.depthFirst()) 
    { 
     node_name = current_node.name().getLocalPart() 
     current_index = xmlString.indexOf('<' + node_name, current_index); 

     if(current_node == node) 
     { 
     end_tag = '</' + node_name + '>'; 
     end_tag_index = xmlString.indexOf(end_tag, current_index) + end_tag.length(); 

     return [current_index, end_tag_index]; 
     } 
    } 

    return -1; 
} 

उत्तर

9

आप update your XML with DOMCategory सकता है। डोम आपका मूल लेआउट रखेगा।

import groovy.xml.DOMBuilder 

def input = ''' 
<shopping> 
    <category type="groceries"> 
     <item>Chocolate</item> 
     <item>Coffee</item> 
    </category> 
    <category type="supplies"> 
     <item>Paper</item> 
     <item quantity="4">Pens</item> 
    </category> 
    <category type="present"> 
     <item when="Aug 10">Kathryn's Birthday</item> 
     <item>Chocolate</item> 
    </category> 
</shopping> 

''' 

def doc = DOMBuilder.parse(new StringReader(input)) 
def root = doc.documentElement 
use(groovy.xml.dom.DOMCategory) { 
    def chocolate = root.depthFirst().grep{it.text() == "Chocolate"} 
    chocolate*.value = "Nutella" 
} 

def result = groovy.xml.dom.DOMUtil.serialize(root) 
println result 
+0

अपने उत्तर के लिए धन्यवाद :) – mbdev

+1

groovy.xml.dom.DOMUtil ग्रूवी 1.8 और बाद में नहीं है। Groovy.xml.XmlUtil.serialize (रूट) को सहेजने के लिए उपयोग किया जाना चाहिए। –

+1

यह स्वरूपण बनाए रखेगा लेकिन टिप्पणियां खो देगा। एक्सएमएल में टिप्पणियों को संरक्षित करने के लिए यहां एक नज़र डालें: https://stackoverflow.com/questions/20690526/preserve-formatting-when-updating-xml-file-with-groovy#20720694 –

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