2012-06-21 3 views
1

저는 그루비에 새로워 도움을 요청합니다. name 속성을 기반으로 델타 XML 파일을 읽고 마스터 XML 파일을 업데이트하려고합니다. 두 XML 파일은 같은 구조입니다. 마스터 XML 파일의 특성 값을 업데이트하려고합니다. 그러나 마스터 파일은 한 번 비워져 파일이 업데이트됩니다. 내가 틀린 곳인지 모르겠습니다. 다음은 Groovy XmlParser로 업데이트하면 Xml이 공백이됩니다.

<item-descriptor name="user" cache-mode="simple" item-cache-size="3000" query-cache-size="1000" item-cache-timeout="900000" query-expire-timeout="60000" /> 
<item-descriptor name="contactInfo" cache-mode="simple" item-cache-size="10000" query-cache-size="1000" item-cache-timeout="900000" query-expire-timeout="60000" /> 

이 코드입니다 : : 아래

는 XML 구조

def templatexmlConfig = new XmlParser().parse(templateConfigFile) 
def basexmlConfig = new XmlSlurper().parse(baseConfigFile) 
def templateItemDesNode = templatexmlConfig.'item-descriptor' 
def baseItemDesNode=basexmlConfig.'item-descriptor' 
templateItemDesNode.each() 
{ 
    Map bindings=[:] 
    def nameAttr=it.attribute('name') 
    it.attributes().each{attrName,attrValue-> 
    if(!attrName.equals('name')) 
    { 
      bindings.put(attrName,attrValue) 
    }} 

    if(baseItemDesNode.find{ [email protected]().equals(nameAttr)}.size()!=0) 
    { 
      bindings.each 
      { 
       def a=it.key 
       def v=it.value 
      baseItemDesNode.find{ [email protected]().equals(nameAttr)}[email protected]'a'="${v}"            } 

    }       
} 
new XmlNodePrinter(new PrintWriter(outputFile)).print(basexmlConfig) 

답변

0

좋아, 주어진 두 개의 예를 들어, XML 문서 :

def templateXml = '''<xml> 
        | <item-descriptor name="a" cache-mode="r1" item-cache-size="1"/> 
        | <item-descriptor name="b" cache-mode="r2" item-cache-size="2" new-attr="tim"/> 
        | <item-descriptor name="z" cache-mode="r3" item-cache-size="3"/> 
        |</xml>'''.stripMargin() ; 
def baseXml = '''<xml> 
       | <item-descriptor name="b" cache-mode="o1" item-cache-size="10"/> 
       | <item-descriptor name="c" cache-mode="o2" item-cache-size="11"/> 
       | <item-descriptor name="a" cache-mode="o3" item-cache-size="12"/> 
       |</xml>'''.stripMargin() 

우리는 이것들을 구문 분석 할 수 (둘 다 XmlParser를 사용하면 하나의 구문 분석기가 있고 다른 하나는 구문 분석기가 필요함)

def templatexmlConfig = new XmlParser().parseText(templateXml) 
def basexmlConfig = new XmlParser().parseText(baseXml) 

그리고 (당신이 그것을 가지고로) 다음

def templateItemDesNode = templatexmlConfig.'item-descriptor' 
def baseItemDesNode = basexmlConfig.'item-descriptor' 

그런 다음 템플릿 item-descriptors을 통해 루프 (findAll 루프 당신보다 쉽게 ​​사용하는 속성이 아닌 이름의 맵을 생성 item-descriptor 노드를 얻을)가 있고, 같은 이름을 가진 baseXml의 노드에서 모든 노드를 대체 :

templateItemDesNode.each() { tidn -> 
    Map bindings = tidn.attributes().findAll { it.key != 'name' } 
    def nameAttr = [email protected] 
    baseItemDesNode.find { b -> [email protected] == nameAttr }?.with { node -> 
    bindings.each { a, v -> 
     [email protected]"$a" = v 
    } 
    } 
} 

그리고이 쉽게 실행 가능한 예를 들어, 바로 XML을 출력 할 :

println new StringWriter().with { sw -> 
    new XmlNodePrinter(new PrintWriter(sw)).print(basexmlConfig) 
    sw.toString() 
} 

그리고 실행은, 위의 인쇄 아웃 때

당신의 작업 코드 분명히
<xml> 
    <item-descriptor name="b" cache-mode="r2" item-cache-size="2" new-attr="tim"/> 
    <item-descriptor name="c" cache-mode="o2" item-cache-size="11"/> 
    <item-descriptor name="a" cache-mode="r1" item-cache-size="1"/> 
</xml> 

, 당신은 당신의 파일이 아닌 문자열을 구문 분석 XmlParsersparse를 사용하여 돌아갈 필요가있다 나는 여기에 파일에 쓰기로 출력을 변경 ...

희망이 있습니다!

+0

설명과 코드 Tim을 이용해 주셔서 감사합니다. 내 코드를 변경하고 테스트 할 것입니다. 윌 당신을 보자. 감사. – user1470220

+0

@ user1470220 Cool. 손가락이 엇갈 렸습니다 :-) –

+0

감사합니다 Tim. 코드 조각을 사용해 보았는데 완벽하게 작동합니다. 고마워. Groovy에 좋은 책을 제안 해 주시겠습니까? 나는 초보자이며 기초를 닦고 싶습니다. – user1470220