2011-01-20 20 views
8

Orijinal düzenini korurken mevcut bir XML dosyasını düzenlemek istiyorum. Bu, yeni satırlar, yorumlar vb. Içerir. Düzenleme, XML içindeki öğeleri bulma ve metin değerini değiştirme işlemlerinden oluşur.Groovy XML dosyasını düzenleyin, yorumları gözden geçirin, satır sonları

İlk denemem XmlUtil.serialize ile XMLParser kullanıyordu, ancak bu gereksinimi karşılamıyor.

XMLParser'a yönelik herhangi bir alternatifin, düzenlemelerin orijinal XML dizesinin "yerinde" olduğu yerlerden herhangi biri var mı? Değilse, belki de XPath/GPath kullanarak arama yapan bir kütüphane var ve sadece bulmacanın yerini döndür, böylece StringBuilder.replace'ı yapabilirim.

DÜZENLEME: Şimdilik

Sonra ben endeksler üzerinde değiştirme yapıyorum (ı xpath kullanarak bulabilmesi) XML düğümün dize endeksleri bulmak için, bu fonksiyonu yaptı. Basit düğümleri için ince Works < düğüm> değeri </düğüm>:

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

cevap

9

Sen update your XML with DOMCategory olabilir. DOM orijinal düzeninizi koruyacaktır. Cevabınız için

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

Teşekkür :) – mbdev

+1

groovy.xml.dom.DOMUtil 1.8 ve üstü harika değil. Groovy.xml.XmlUtil.serialize (root) için kaydetme kullanılmalıdır. –

+1

Bu, biçimlendirmeyi koruyacak ancak yorumları kaybedecektir. XML'deki yorumları korumak için şuraya bakın: https://stackoverflow.com/questions/20690526/preserve-formatting-when-updating-xml-file-with-groovy#20720694 –

İlgili konular