2011-01-20 14 views
8

Me gustaría editar un archivo XML existente conservando su diseño original. Esto incluye nuevas líneas, comentarios, etc. La edición se compone de encontrar elementos dentro del XML y modificar el valor del texto.Groovy editar archivo XML, guardar comentarios, saltos de línea

Mi primer intento fue usar XMLParser con XmlUtil.serialize pero eso no cumple con el requisito.

¿Alguien tiene conocimiento de alguna alternativa a XMLParser donde las ediciones estén "en su lugar" de la cadena XML original? Si no, tal vez haya una biblioteca que realice búsquedas usando XPath/GPath y simplemente devuelva la ubicación del hallazgo para que pueda hacer StringBuilder.replace.

EDITAR:

Por lo pronto les hizo esta función, para encontrar los índices de cadenas de nodo XML (que puedo encontrar utilizando XPath) entonces yo estoy haciendo reemplazar en los índices. Funciona bien para los nodos simples < nodo> valor </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; 
} 

Respuesta

9

Usted podría update your XML with DOMCategory. DOM mantendrá su diseño original.

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

Gracias por su respuesta :) – mbdev

+1

groovy.xml.dom.DOMUtil no está en maravilloso 1.8 y posteriores. Para guardar groovy.xml.XmlUtil.serialize (root) debe ser utilizado. –

+1

Esto mantendrá el formato pero perderá los comentarios. Para conservar los comentarios en XML, consulte aquí: https://stackoverflow.com/questions/20690526/preserve-formatting-when-updating-xml-file-with-groovy#20720694 –

Cuestiones relacionadas