1

私は次のxmlコードを持っています:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <cms:RelatedConfigurationItemList xmlns:cms="some namespace">
         <ConfigurationItem>
            <name>data</name>
            <id>data</id>
            <type>data</type>
            <relationship>IS CHILD OF</relationship>
            <ConfigurationItemList>
               <ConfigurationItem>
                  <name>data</name>
                  <id>data</id>
                  <type>data</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
               <ConfigurationItem>
                  <name>data</name>
                  <id>data</id>
                  <type>data</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
            </ConfigurationItemList>
         </ConfigurationItem>
     <ConfigurationItem>
            <name>other data</name>
            <id>other data</id>
            <type>other data</type>
            <relationship>IS CHILD OF</relationship>
            <ConfigurationItemList>
               <ConfigurationItem>
                  <name>other data</name>
                  <id>other data</id>
                  <type>other data</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
               <ConfigurationItem>
                  <name>other data</name>
                  <id>other data</id>
                  <type>other data</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
            </ConfigurationItemList>
         </ConfigurationItem>
      </cms:RelatedConfigurationItemList>
   </soapenv:Body>
</soapenv:Envelope>

次の疑似コードを使用してGroovyで検証したいこと:

def request = testRunner.testCase.getTestStepByName( "relationship_request" )
def resp = new File('H://test_xml.xml')
def cms_ns = new groovy.xml.Namespace("namespace for cms",'cms')
def soap_ns = new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/",'soapenv')
def root = new XmlSlurper().parse(resp)


def config_item = root[soap_ns.Envelope][soap_ns.Body][cms_ns.RelatedConfigurationItemList][ConfigurationItem]

config_item.each{
    it.name.each{
        it == corresponding value in db?
        else
        die
    }
}

しかし、データベースの応答に対して定義された値(名前など)を検証しようとするための構文、ロジックを正しく理解できないようです。config_item宣言が正しければ、Groovyクロージャについてよく理解していない可能性があります。また、XMLスラーパーまたはパーサーがより適切であり、違いが正確に何であるかを完全に特定することはできません。これが問題の適切な説明であることを願っています。

4

3 に答える 3

2

XmlSlurperはオンデマンドベースで動作し、メモリをあまり消費しません。xmlの多くのノードにアクセスする必要がある場合は、通常、XmlParserを使用します。または、xmlの1つまたは2つのノードを読み取りたいだけの場合は、Slurperを使用します。

この例は、XMLParserがどのように機能するかを理解するのに役立ちます。

あなたの場合、構成アイテムの宣言と名前空間の使用法は構文的に正しいですが、xmlの多くまたはすべてのコンポーネントを検証している可能性があるため、XmlParserを使用するのが理想的かもしれません。クロージャを使用した要素へのアクセスに関して混乱する可能性があります。これは、理解しやすい名前空間のない例です。

   xml = '''<Envelope>
   <Body>
      <RelatedConfigurationItemList>
         <ConfigurationItem>
            <name>Top level name1</name>
            <id>Top level id1</id>
            <type>Top level type1</type>
            <relationship>IS CHILD OF</relationship>
            <ConfigurationItemList>
               <ConfigurationItem>
                  <name>data1</name>
                  <id>data1</id>
                  <type>data1</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
               <ConfigurationItem>
                  <name>data2</name>
                  <id>data2</id>
                  <type>data2</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
            </ConfigurationItemList>
         </ConfigurationItem>
     <ConfigurationItem>
            <name>Top level name2</name>
            <id>Top level id2</id>
            <type>Top level type2</type>
            <relationship>IS CHILD OF</relationship>
            <ConfigurationItemList>
               <ConfigurationItem>
                  <name>other data</name>
                  <id>other data</id>
                  <type>other data</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
               <ConfigurationItem>
                  <name>other data</name>
                  <id>other data</id>
                  <type>other data</type>
                  <relationship>IS CHILD OF</relationship>
                  <ConfigurationItemList/>
               </ConfigurationItem>
            </ConfigurationItemList>
         </ConfigurationItem>
      </RelatedConfigurationItemList>
   </Body>
</Envelope>'''



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

//For accessing top level top level Configuration Item
Envelope.Body.RelatedConfigurationItemList.ConfigurationItem.each{
 //Put your check conditions here.. == or any other
 assert it.name.text().contains("Top level name")
 assert it.id.text().contains("Top level id")
 assert it.type.text().contains("Top level type")
 //Inner children configuration items
 it.ConfigurationItemList.ConfigurationItem.each{
     assert it.name.text().contains("data")
     assert it.id.text().contains("data")
     assert it.type.text().contains("data")
 }       
}
于 2012-07-24T06:20:05.443 に答える
1

あなたはほとんどそれを持っていました...

XmlParserの代わりに(Vamsiによって提案されたように)使用すると、次のXmlSlurperようになります。

def cms_ns = new groovy.xml.Namespace("some namespace",'cms')
def soap_ns = new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/",'soapenv')
def root = new XmlParser().parse(resp)

def config_item = root[soap_ns.Body][cms_ns.RelatedConfigurationItemList].ConfigurationItem

Envelopeこれはルートノードであり、すでにロードされていると見なされるため、タグを使用して区別する必要はありません。

于 2012-07-24T09:10:57.867 に答える
0

XmlSlurperは問題ありません。次のことを試してください。

def configItem = root.'**'.findAll{
   it.name()=='ConfigurationItem'
}

configItem.each{
   // check data here
}

これは、あなたが達成しようとしていることであると仮定して、すべての構成項目を再帰的にチェックする必要があります。

于 2012-07-24T03:09:27.430 に答える