0

私はこのようなxml構造を持っています

<JJJ version="2.0" >
<Data >
 <Object class="classX">
  <k name="constname1">variable1</p>
  <k name="constname2">variable2</p>
  <k name="constname3">variable3</p>
</Object>
 <Object class="classY">
  <k name="constname1">variable11</p>
  <k name="constname2">variable12</p>
  <k name="constname3">variable13</p>
</Object>

ClassX ノードを選択する必要があり、constname1 を含む属性の値 (つまり variable1

def parser = new XmlSlurper()
def mymo=records.'Data'.'Object';
def mytest =  mymo.findAll{it.@class.text()=="ClassX"};
mytest.each{
it.'p'.each{
  println  it.@name.text() +'-'+ it.text() }
 }

これは機能しています。しかし、ループ内のテキストを比較する代わりに、このようなことをする必要があります

def testme= mytest.'k'.find{ it.@name.text()=="constname1"}

これは私が正しくない

ただし、以下は正しいです

      println mymo.'k'.find{it.@name.text()=="constname1"}

しかし、classX のノードに選択を制限したい

4

2 に答える 2

0

有効になるようにxmlを修正すると、次のようになります。

def xml = '''<JJJ version="2.0" >
            |  <Data >
            |    <Object class="classX">
            |      <k name="constname1">variable1</k>
            |      <k name="constname2">variable2</k>
            |      <k name="constname3">variable3</k>
            |    </Object>
            |    <Object class="classY">
            |      <k name="constname1">variable14</k>
            |      <k name="constname2">variable15</k>
            |      <k name="constname3">variable16</k>
            |    </Object>
            |    <Object class="classX">
            |      <k name="constname1">variable7</k>
            |      <k name="constname2">variable8</k>
            |      <k name="constname3">variable9</k>
            |    </Object>
            |  </Data>
            |</JJJ>'''.stripMargin()

List var = new XmlSlurper().parseText( xml ).'**'.grep { 
  it.@name == 'constname1' && it.parent().@class == 'classX'
}

assert var == [ 'variable1', 'variable7' ]

それはあなたが望んでいたものですか?

于 2012-11-22T11:55:48.853 に答える
0

私は正しい方法だったと思います

mytest.'k'.find{ it.['@name']=="constname1"}

他のいくつかのxmlリンクについても同様でした-> GPath Groovy

于 2013-02-05T10:34:17.883 に答える