2012-11-22 88 views
0

我有一个XML结构这样Groovy的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节点并在含有atttribute constname1的那个值(即变量1

def parser = new XmlSlurper() 
def mymo=records.'Data'.'Object'; 
def mytest = mymo.findAll{[email protected]()=="ClassX"}; 
mytest.each{ 
it.'p'.each{ 
    println [email protected]() +'-'+ it.text() } 
} 

这是工作但是,代替然后在循环comapring文本,我需要做这样的事情

def testme= mytest.'k'.find{ [email protected]()=="constname1"} 

这个我没有得到正确的

但是下面的是正确

 println mymo.'k'.find{[email protected]()=="constname1"} 

但我想限制选择的节点classX

回答

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 { 
    [email protected] == 'constname1' && it.parent()[email protected] == 'classX' 
} 

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

是你想要的吗?

+0

那么可以有更多的节点与ClassX,我需要使用.findAll;然后它不起作用;基本上我需要得到所有类的列表,其中包含类似于'def mytest = mymo.findAll {it。@ class.text()==“ClassX”};''然后在该文件上执行'find' –

+0

@alexcpn你能否更新你的问题,这样的例子显示你实际上有什么和你需要的结果? –

+0

@alexcpn更新了我的答案...是否更接近? –

0

我想正确的办法是

mytest.'k'.find

有没有一些其他XML链接类似{它[ '@名字'] == “constname1”} - >GPath Groovy