Variables 如何将GPath与变量一起使用?

Variables 如何将GPath与变量一起使用?,variables,groovy,findall,xmlslurper,gpath,Variables,Groovy,Findall,Xmlslurper,Gpath,假设我手头有以下XML <Envelope> <Body> <analyzeEffectOfReplaceOfferResponse> <productOfferings> <productOffering> <id>some value</id> </productOffering> </productOf

假设我手头有以下XML

<Envelope>
  <Body>
    <analyzeEffectOfReplaceOfferResponse>
      <productOfferings>
        <productOffering>
          <id>some value</id>
        </productOffering>
      </productOfferings>
    </analyzeEffectOfReplaceOfferResponse>
  </Body>
</Envelope>
当我尝试像这样查找节点时:

inputXML."Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering".depthFirst().findAll {it.value}
我获得所需的孩子“id”

但是,如果我使用包含此文本的字符串:

"Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering"
并像这样使用它:

inputXML."${xPath}".depthFirst().findAll {it.value}
它不起作用。。。
我做错了什么?

在您当前的尝试中,Groovy正在调用
inputXML
对象上的方法,参数为
“Body”。“analyzeEffectOfReplaceOfferResponse”。“productOffices”。“productOffering”

由于没有具有该特定名称的XML子元素,因此找不到任何内容

相反,您的目标是按照以下方式动态链接调用:

inputXML.getProperty('Body')
        .getProperty('analyzeEffectOfReplaceOfferResponse')
        .getProperty('productOfferings')
        .getProperty('productOffering')
        .depthFirst().findAll {it.value}
您可以通过创建一个递归创建此链接的方法来实现这一点,例如

def xPath = '"Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering"'

def getProperties(gpathResult, dotProp) {
    def props = dotProp?.split(/\./)
    props.length <= 1 ? gpathResult : getProperties(gpathResult[props.head() - '"' - '"'], (props.tail().join('.')))
}

getProperties(inputXML, xPath).depthFirst().findAll {it.value}
defxpath=''Body'.'analyzeeffectofreplaceoffereresponse'.'productOffices'.'productOffices''
def getProperties(gpathResult、dotProp){
def props=dotProp?.split(/\./)
道具长度可使用:

def inputXML=new XmlSlurper().parseText(“”)
一些价值
''')
println inputXML。“Body”。“analyzeeffectofreplaceoffereresponse”。“ProductOffices”。“ProductOffices”。“ProductOffices”.depthFirst().findAll{it.value}
//使用Eval.me groovy代码求值
def gpath='XML.“Body”。“analyzeeffectofreplaceoffereresponse”。“ProductOffices”。“ProductOffices”
println Eval.me('XML',inputXML,gpath).depthFirst().findAll{it.value}
//甚至像这样:
gpath='XML.'Body'.'analyzeEffectOfReplaceOfferResponse'.'productOffices'.'productOffices'.'depthFirst().findAll{it.value}'
println Eval.me('XML',inputXML,gpath)

您是必须使用字符串,还是只是在寻找存储元素路径的方法,以便以后不必再次键入

String xml = '<Envelope><Body><analyzeEffectOfReplaceOfferResponse><productOfferings><productOffering><id>some value</id></productOffering></productOfferings></analyzeEffectOfReplaceOfferResponse></Body></Envelope>'
def Envelope = new XmlSlurper().parseText(xml)
Closure takeMyPathFrom = {node -> node."Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering"}
assert takeMyPathFrom(Envelope) == "some value"
stringxml='somevalue'
def Envelope=new XmlSlurper().parseText(xml)
闭包takeMyPathFrom={node->node.“Body”。“analyzeeffectofreplaceofResponse”。“productOffices”。“productOffices”}
断言takeMyPathFrom(信封)==“某些值”

但是在这个例子中,
gpath
是一个字符串,你可以从任何存储中获取它……你能提供更多的信息吗?到底是什么不起作用了……我实际上发现了我的问题——这是一个简单的值错误。不过,我很好奇——这最终会得到一组字符串。如果我想获取XML中的实际节点,以便更新e他们?您当前的代码将返回一组表示productOffering节点及其父节点的
groovy.util.slurpersupport.NodeChildren
。这是一种有趣的方法,但只适用于最简单的
gpath
表达式,也就是说,它不适用于例如
a.B[1].C
或类似的表达式,是吗?
def inputXML = new XmlSlurper().parseText( '''<Envelope>
  <Body>
    <analyzeEffectOfReplaceOfferResponse>
      <productOfferings>
        <productOffering>
          <id>some value</id>
        </productOffering>
      </productOfferings>
    </analyzeEffectOfReplaceOfferResponse>
  </Body>
</Envelope>''')

println inputXML."Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering".depthFirst().findAll {it.value}

//use Eval.me groovy code evaluation
def gpath = ' XML."Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering" '
println Eval.me( 'XML', inputXML, gpath ).depthFirst().findAll {it.value}

//or even like this:
gpath = ' XML."Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering".depthFirst().findAll {it.value} '
println Eval.me( 'XML', inputXML, gpath )
String xml = '<Envelope><Body><analyzeEffectOfReplaceOfferResponse><productOfferings><productOffering><id>some value</id></productOffering></productOfferings></analyzeEffectOfReplaceOfferResponse></Body></Envelope>'
def Envelope = new XmlSlurper().parseText(xml)
Closure takeMyPathFrom = {node -> node."Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering"}
assert takeMyPathFrom(Envelope) == "some value"