2011-01-20 14 views
8

Desidero modificare un file XML esistente mantenendo il layout originale. Ciò include nuove linee, commenti, ecc. La modifica è composta dal trovare elementi all'interno dell'XML e modificare il valore del testo.Groovy modifica file XML, conserva commenti, interruzioni di riga

Il mio primo tentativo è stato utilizzare XMLParser con XmlUtil.serialize ma che non soddisfa il requisito.

Chiunque è a conoscenza di un'alternativa a XMLParser in cui le modifiche sono "in atto" della stringa XML originale? In caso contrario, forse esiste una libreria che esegue la ricerca utilizzando XPath/GPath e restituisce semplicemente la posizione della ricerca in modo da poter eseguire StringBuilder.replace.

EDIT:

Per ora ho fatto questa funzione, per trovare gli indici di stringa di nodo XML (che posso trovare utilizzando XPath) quindi sto facendo sostituire sugli indici. Funziona bene per i nodi semplici < nodo> valore </node>:

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; 
} 

risposta

9

Si potrebbe update your XML with DOMCategory. DOM manterrà il tuo layout originale.

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

Grazie per la risposta :) – mbdev

+1

groovy.xml.dom.DOMUtil non è in Groovy 1.8 e versioni successive. Per salvare è necessario utilizzare groovy.xml.XmlUtil.serialize (root). –

+1

Ciò manterrà la formattazione ma perde i commenti. Per conservare i commenti in XML, dai un'occhiata qui: https://stackoverflow.com/questions/20690526/preserve-formatting-when-updating-xml-file-with-groovy#20720694 –

Problemi correlati