1

假设我手头有以下 XML

<Envelope>
  <Body>
    <analyzeEffectOfReplaceOfferResponse>
      <productOfferings>
        <productOffering>
          <id>some value</id>
        </productOffering>
      </productOfferings>
    </analyzeEffectOfReplaceOfferResponse>
  </Body>
</Envelope>

在检索文件并解析它之后,我还有 GPathResult 形式的输入 XML:

inputXML = new XmlSlurper().parse(inputFile)

当我尝试找到这样的节点时:

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

我得到所需的孩子“id”

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

"Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."productOffering"

并像这样使用它:

inputXML."${xPath}".depthFirst().findAll {it.value}

它不起作用......我做错了什么?

4

3 回答 3

1

可以使用Eval.me

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 )
于 2018-02-21T20:04:07.050 回答
1

在您当前的尝试中,Groovy 正在使用参数调用对象的getProperty方法。inputXML"Body"."analyzeEffectOfReplaceOfferResponse"."productOfferings"."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}

或者,您可以使用成熟的 XPath 库。

于 2018-02-21T19:24:45.270 回答
0

您是否必须使用字符串,或者您只是在寻找一种方法来存储元素的路径,以便以后不必再次键入它?

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"
于 2018-02-24T08:30:20.200 回答