当前位置: 首页 > 知识库问答 >
问题:

Groovy xml基于父模式属性选择子节点属性

廖令
2023-03-14

我有一个像这样的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)AttAttribute的值中

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的节点

共有1个答案

江俊能
2023-03-14

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

这是你想要的吗?

 类似资料:
  • 如何能够基于另一个同级节点的属性选择节点属性?我想要实现的是从所有节点中提取链接(href值),这些节点后跟具有属性class=“body table news loss”的节点跨度,即选择器应该返回https://finance.yahoo.com/news/inspiremd-announces-planned-recapitalization-120000752.html在下面的示例中。我试

  • 我想递归地连接一个节点的参数值和它的父节点的相同参数值。 例如,如下: 应该成为 我试过了 有什么问题吗?

  • 我有一个C#类 产品有名称、价格等属性 我想要一个linq查询,它将返回带有产品数组的产品类别的结构,但仅当产品的属性等于一个值时。例如价格是10的地方。 我试过了 但这返回给我一个产品数组,但我想要产品类别中所有符合条件的产品。 作为一个额外的挑战,我也有多个标准,所以在这个例子中,假设价格等于10,30和50。其中一个标准有两个值,这就增加了复杂性。我要做的只是调用不同的选择标准,然后在结尾处

  • 对于下面的XML,我正在尝试根据属性和节点值提取节点。 基于属性class=pass和h1包含('objectives'),我试图提取以下输出。 “目标”是节点值字符串“1任务目标”的一部分 1任务目标1目标2 下面是我正在尝试的XPath表达式。然而,这并没有产生任何输出。你能指出我做错了什么吗? 谢谢

  • SyntaxError:无效输入“h”:预期为“I/I”(第10行,第28列(偏移量:346))“merge(p:primaryconsumer),其中p.name=svc.name” 我100%确信这些名称是唯一的,并且将与现有节点集中的唯一使用者名称相匹配(有待观察)。 当唯一节点属性匹配时,如何将现有属性添加到新数据中?(我希望获得唯一的ID,但我必须能够在匹配上执行新数据的更新)

  • 我正在尝试创建az xpath,我想在其中获取一个节点,其中存在一个具有属性的子节点。我的问题是,这个结构中唯一的区别是子属性。这里有一个例子来告诉你我的意思: 例如,给定UniqueName3,我想获取包含它的记录。到目前为止,我尝试了以下操作: 然而,有了这个,我得到了所有具有field_name属性的值节点。