【问题标题】:Reading conditional XML node Groovy读取条件 XML 节点 Groovy
【发布时间】:2012-08-03 14:52:23
【问题描述】:

我有以下 SOAP 响应:

我需要选择具有 nIdType="ACTIVE" 的地址和 nId。

可能有更多地址和 nId,我需要选择第一个匹配的。

我编写了 groovy 脚本但没有成功。请帮助我,因为我是新手

所有地址都可能有也可能没有nId

我有需要更新地址和 nId 的测试属性

我需要通过groovy脚本来实现wh

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <ns2:GetD xmlns:ns2="http://xyxz/pqr" xmlns:ns3="http://pqp/ptr" xmlns:ns4="http://nhgg./ns">
            <ns2:du>
                <ns2:Address>UUUUUU</ns2:macAddress>
            </ns2:du>
            <ns2:du>
                <ns2:Address>XXXXXXX</ns2:macAddress>
            </ns2:du>
            <ns2:du>
                <ns2:Address>PQWWEEE</ns2:macAddress>
            <ns2:dP>
                <ns2:pN>1</ns2:pN>
                <ns2:sE>
                    <ns2:nId>08767727</ns2:nId>
                    <ns2:nIdType>ACTIVE</ns2:nIdType>
                <ns2:sE>
            </ns2:dP>
            </ns2:du>
            <ns2:du>
                <ns2:Address>TTTTTTTT</ns2:macAddress>
            </ns2:du>
        </ns2:GetD>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

【问题讨论】:

    标签: groovy xml-parsing


    【解决方案1】:

    您可以这样做(我必须在您的 XML 中添加一个结束 &lt;/SOAP-ENV:Envelope&gt; 标记并将 &lt;/ns2:macAddress&gt; 更改为 &lt;/ns2:Address&gt; 以使其成为有效的 XML)

    def xml = '''<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
                |  <SOAP-ENV:Header/>
                |  <SOAP-ENV:Body>
                |    <ns2:GetD xmlns:ns2="http://xyxz/pqr" xmlns:ns3="http://pqp/ptr" xmlns:ns4="http://nhgg./ns">
                |      <ns2:du>
                |        <ns2:Address>UUUUUU</ns2:Address>
                |      </ns2:du>
                |      <ns2:du>
                |        <ns2:Address>XXXXXXX</ns2:Address>
                |      </ns2:du>
                |      <ns2:du>
                |        <ns2:Address>PQWWEEE</ns2:Address>
                |        <ns2:dP>
                |          <ns2:pN>1</ns2:pN>
                |          <ns2:sE>
                |            <ns2:nId>08767727</ns2:nId>
                |            <ns2:nIdType>ACTIVE</ns2:nIdType>
                |          </ns2:sE>
                |        </ns2:dP>
                |      </ns2:du>
                |      <ns2:du>
                |        <ns2:Address>TTTTTTTT</ns2:Address>
                |      </ns2:du>
                |    </ns2:GetD>
                |  </SOAP-ENV:Body>
                |</SOAP-ENV:Envelope>'''.stripMargin()
    
    def a = new XmlSlurper().parseText( xml ).Body?.GetD?.du?.find { node ->
      node.dP?.sE?.nIdType.text() == 'ACTIVE'
    }
    
    println "First Active Address = ${a?.Address?.text()}"
    

    打印出来的:

    First Active Address = PQWWEEE
    

    但是很难从你的问题中确切地看出你在追求什么

    【讨论】:

    • 非常感谢 ..我无法对 XML 进行硬编码,因为该响应来自我本质上是动态的服务.. def response = context.expand( '${getD#Response}' ) 我可以使用响应而不是您的 xml 变量
    • @user1574409 是的,你应该可以(假设response 是一个包含有效 XML 的字符串)。为了一个工作示例,我只是对其进行了硬编码
    • 感谢蒂姆..它工作并满足我的要求..如果我想打印所有具有 nIdType=="ACTIVE" 的活动地址该怎么办。我是否需要做 findall 而不是 all 以及如何循环打印所有内容或任何其他技术
    • find 更改为findAll,然后执行a?.each { println it.Address?.text() }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多