2017-11-01 37 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

関連する問題