2011-01-20 5 views
8

기존 XML 파일을 원래의 레이아웃으로 유지하면서 편집하고 싶습니다. 여기에는 새로운 줄, 주석 등이 포함됩니다. 편집은 XML 내부의 요소를 찾고 텍스트 값을 수정하는 것으로 구성됩니다.Groovy XML 파일 편집, 주석, 줄 바꿈 유지

내 첫 번째 시도는 XmlUtil.serialize와 함께 XMLParser를 사용하고 있었지만 요구 사항을 충족하지 못했습니다.

누구나 원본 XML 문자열의 편집 위치를 XMLParser로 대체 할 수 있습니까? 그렇지 않다면 아마도 XPath/GPath를 사용하여 검색을 수행하는 라이브러리가 있으며이 라이브러리의 위치를 ​​반환하면 StringBuilder.replace를 수행 할 수 있습니다.

편집 : 지금은

나는 그때 인덱스에 대체 뭐하는 거지 (내가 XPath를 사용하여 찾을 수 있습니다) XML 노드의 문자열 인덱스를 찾기 위해이 기능을했다. 간단한 노드에 대해 잘 작동 < 노드> 값 </노드> :

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을 할 수 있었다. DOM은 원래 레이아웃을 유지합니다. 답장을 보내

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 (root)를 사용해야합니다. –

+1

이렇게하면 서식은 유지되지만 의견은 잃게됩니다. XML에서 주석을 유지하려면 다음을 살펴보십시오. https://stackoverflow.com/questions/20690526/preserve-formatting-when-updating-xml-file-with-groovy#20720694 –