2017-11-01 7 views
0

헤더 컨텍스트 내의 속성을 포함하는 XML 문서를 구문 분석해야합니다.Groovy GPath Slurper를 사용하여 XML 속성 값 가져 오기

<?xml version="1.0" encoding="UTF-8"?> 
<S38:manageRequest xmlns:S38="http://ns.com/S38" xmlns:header="http://ns.com/header/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ns.com/xsd/ManageItem XSD\ManageItem.xsd"> 
    <header:standardHeader> 
     <header:serviceAddressing> 
      <header:to> 
       <header:address>http://ns.com/BLAHBLAH</header:address> 
       <header:contextItemList> 
        <header:contextItem contextName="Channel" contextId="http://ns.com/contextItem">I Need This</header:contextItem> 
        <header:contextItem contextName="Box" contextId="http://ns.com/contextItem">Blue</header:contextItem> 
       </header:contextItemList> 
      </header:to> 
     </header:serviceAddressing> 
    </header:standardHeader> 
</S38:manageRequest> 

나는 "나는이 필요하십니까"groovy.util.slurpersupport.GPathResult를 사용하여 속성 "채널"값을 얻을합니다.

나는 작동하는 방법을 발견했다,하지만 난이 contextItem을 따기 오전 다행히 첫 번째는 내가 관심 오전 하나로서이 정확하다고 생각하지 않습니다 사용하는

private Map parseServiceAddressing(GPathResult message,Map values){ 
def serviceAddressingList=message."standardHeader"."serviceAddressing"."to"."contextItemList"; 
    if(serviceAddressingList.isEmpty()){ 
    throw new sourceException("serviceAddressing list is missing",values); 
} 

def contextItem=serviceAddressingList.'*'.find{ 
    it.name()=='contextItem' 
    }; 

values.put(tag.CHANNEL, contextItem); 

return values; 

모든 시도 Channel은 위치 텍스트로 값을 검색하지 못합니다. 불행히도 GPath를 매우 큰 Groovy 스크립트의 일부로 사용하는 것에 묶여 있습니다.이 스크립트는 다른 것들을 많이 수정합니다.

이 문제를 해결하는 올바른 방법을 알려주시겠습니까?

답변

2

당신은 요소 이름을 사용하여 찾을 수 있어야하고 아래 그림과 같이 요소가 요청 값과 일치되는 속성 :

def xmlString = """<?xml version="1.0" encoding="UTF-8"?> 
<S38:manageRequest xmlns:S38="http://ns.com/S38" xmlns:header="http://ns.com/header/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ns.com/xsd/ManageItem XSD/ManageItem.xsd"> 
    <header:standardHeader> 
     <header:serviceAddressing> 
      <header:to> 
       <header:address>http://ns.com/BLAHBLAH</header:address> 
       <header:contextItemList> 
        <header:contextItem contextName="Channel" contextId="http://ns.com/contextItem">I Need This</header:contextItem> 
        <header:contextItem contextName="Box" contextId="http://ns.com/contextItem">Blue</header:contextItem> 
       </header:contextItemList> 
      </header:to> 
     </header:serviceAddressing> 
    </header:standardHeader> 
</S38:manageRequest>""" 


def xml = new XmlSlurper().parseText(xmlString) 
def cItemChannel = xml.'**'.find {it.name() == 'contextItem' && [email protected] == 'Channel'}?.text() 
println cItemChannel 

당신은 신속하게 온라인 좋아요 demo

+0

그것을 시도 할 수는 치료를 작동, 나는 알고 있었다 올바른 가치를 보장 할 수있는 방법이있을 것입니다. 당신의 도움을 주셔서 감사합니다! – Plasma

+0

@Plasma, 도움이 된 것을 기쁘게 생각합니다. – Rao