【问题标题】:Groovy xml selecting child node attribute based on parent mode attributeGroovy xml根据父模式属性选择子节点属性
【发布时间】:2012-11-10 19:39:07
【问题描述】:

我有一个这样的 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 的节点

【问题讨论】:

    标签: groovy xml-parsing


    【解决方案1】:

    更正您的 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' ]
    

    这就是你想要的吗?

    【讨论】:

    • ClassX 可以有更多节点,我需要使用 .findAll;但是它不起作用;基本上我需要获取所有包含 classX 的类的列表,例如def mytest = mymo.findAll{it.@class.text()=="ClassX"};,然后对其进行“查找”
    • @alexcpn 您能否更新您的问题,以便该示例显示您实际拥有的内容以及您需要的结果?
    • @alexcpn 更新了我的答案...更接近了吗?
    【解决方案2】:

    我猜正确的方法是

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

    对其他一些 xml 链接做了类似的事情 -->GPath Groovy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多