2

次のような XML があります。

<Envelope>
 <Node>
    <Status>1</Status>
    <Name1>John</Name1>
    <Name2>Smith</Name2>
 </Node>
 <Node>
    <Status>2</Status>
    <Name1>Jane</Name1>
    <Name2>Doe</Name2>
 </Node>
</Envelope>

各ノードを反復処理し、Status の値が 1 の場合は Name1 を使用し、2 の場合は Name2 を使用します。

Envelope = holder.getNodeValues("//ns2:NonProvisionedServers")
for(node in Envelope)
if(node.Status == 1)
{
    assert node.Name1 == "SomeFirstName"
}
if(node.Status == 2)
{
    assert node.Name2 == "SomeLastName"
}

以前に最小限の Groovy スクリプトを作成したことがあります。関連する投稿を見たことがありますが、それらは子ノードのみを反復処理します。これは、親ノードに多くの子ノードがあり、通過する親ノードがたくさんあるため、実行したくありません。どんな助けでも大歓迎です。

4

1 に答える 1

5

次の方法で実行できます。

def inx = '''<Envelope>
            |  <Node>
            |    <Status>1</Status>
            |    <Name1>John</Name1>
            |    <Name2>Smith</Name2>
            |  </Node>
            |  <Node>
            |    <Status>2</Status>
            |    <Name1>Jane</Name1>
            |    <Name2>Doe</Name2>
            |  </Node>
            |</Envelope>'''.stripMargin()

// Parse the XML
def xml = new XmlSlurper().parseText( inx )

// For every <Node> element in the XML
xml.Node.each { node ->

  // Print the child of the node called "Name" + Status
  println node."Name${node.Status}"
}

それは印刷します:

John
Doe
于 2012-07-09T14:14:45.137 に答える