2017-02-26 10 views
0

groovyの新機能です。Groovy xmlリクエストの解析

いくつかのxmlリクエストを解析していますが、しばらく運が必要です。

決勝結果:

  1. 私は、XML要求 "RequestRecords" は "DetailsRequest" atrributeを持っているかどうかを確認したいです。
  2. "RequestF"にFieldName = "Id"がある "FieldValue"番号を取得します。

また、何らかの理由でXmlSlurperを使用できません。これは、 'def root = new XmlParser()。parseText(xml)'にfalseを返すためです。

def env = new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/", 'env'); 
def ns0 = new groovy.xml.Namespace("http://tempuri.org/", 'ns0') 

def xml = '''<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://tempuri.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<env:Body> 
    <ns0:Request1> 
     <ns0:Request_Sub> 
      <ns0:RequestRecords TableName="Header"> 
       <ns0:RequestF FieldName="SNumber" FieldValue="XXX"/> 
       <ns0:RequestF FieldName="TNumber" FieldValue="30"/> 
      </ns0:RequestRecords> 
      <ns0:RequestRecords TableName="Details"> 
       <ns0:RequestF FieldName="Id" FieldValue="1487836040"/> 
      </ns0:RequestRecords> 
     </ns0:Request_Sub> 
     <ns0:isOffline>false</ns0:isOffline> 
    </ns0:Request1> 
</env:Body> 
</env:Envelope>''' 

def root = new XmlParser().parseText(xml) 

println ("root" + root) 

assert "root_node" == root.name() 
println root_node  

ルートノードのアサートも失敗します。

答えて

0

XmlSlurperまたはXmlParserは正常に動作するはずです。私が見ることができるところから、彼らは機能的に同等であるように見えます。それらはメモリ使用量とパフォーマンスだけが異なります。

このコードをjavadocの例からコピーしたように見えますが、一部のコードの意味を理解することはありません。明らかに、例のルートノードの名前は "root_node"だったので "ルートノード"のアサーションは失敗しますが、コードからは "エンベロープ"です。

XmlSlurperが機能しないと言っている理由がわかりません。コードサンプルを使用しても、それを使用していません。

+0

は、だから何が正しいの主張は、この場合にはすべきですか? アサートroot.name()== 'エンベロープ' も失敗します。 –

+0

それが何であるかを確認するために、アサーションの前に 'println "root [$ {root.name}]"'を追加するのは簡単です。それは私のために "封筒"を示しています。 –

1

は、そのXMLを考えると、あなたはそうのようなあなたの二つの質問に答えを得るためにXmlSlurperを使用することができます。

def root = new XmlSlurper().parseText(xml) 

// I want to check if xml request "RequestRecords" has "DetailsRequest" atrribute 
List<Boolean> hasAttribute = root.Body 
           .Request1 
           .Request_Sub 
           .RequestRecords 
           .collect { it.attributes().containsKey('DetailsRequest') } 
assert hasAttribute == [false, false] 

// Get "FieldValue" number where "RequestF" has FieldName="Id". 
String value = root.Body 
        .Request1 
        .Request_Sub 
        .RequestRecords 
        .RequestF 
        .find { [email protected] == 'Id' }[email protected] 

assert value == '1487836040' 
+0

フレーズが見つかった場合、 "hasAttribute"がtrueを返すように正しく理解していれば、何らかの形で、常に "Details"、 ".containsKey( 'Details')を検索してfalseを返します。 価値の検索が動作します - ありがとうございます。 –

+0

「.collect {it.attributes()。containsKey ..」がうまくいかない理由は何ですか? –