Groovy 验证节点是否存在

问题描述

我正在尝试在 Groovy 中验证节点是否来自外部系统,如果外部系统有值,则节点带有值,如果系统没有值,则节点不会出现在有效负载中.

基于此,我需要更改/更正现有节点中该记录的新或更新过程。

传入的 XML 是:

true

我创造了这个 groovy:

    <urn:ExternalReqForApprovalImportRequest xmlns:urn="urn:Ariba:Buyer:vrealm_1" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" partition="" variant="">
        <urn:ExternalReqForApprovalInput_Item>
            <urn:item>
                <urn:Name>TEST</urn:Name>
                <urn:Operation>XXXXXX</urn:Operation>
                <urn:HeaderExtrinsics>
                    <Extrinsics>
                        <Extrinsic name="PRRefID">THIS IS THE NODE THAT MAY OR NOT MAY COME</Extrinsic>
                        <Extrinsic name="XXXXXXX">Value</Extrinsic>
                        <Extrinsic name="AnotherField">TValue</Extrinsic>
                    </Extrinsics>
                </urn:HeaderExtrinsics>
            </urn:item>
        </urn:ExternalReqForApprovalInput_Item>
    </urn:ExternalReqForApprovalImportRequest>

我想要实现的是验证名称为 PRRefID 的 Extrinsic 是否出现在 xml 中,如果出现,我需要将 Operation 更新为 UPDATE,如果没有出现,我需要将 NEW 设置为价值。

我尝试将 xpath 映射为属性(可能有一种更简洁的方法可以从直接 xpath 映射它),但我现在的问题是更改值,因为它是具有特定名称的外在属性,显然是也没有正确的分配格式,那么应该是哪种格式?

谢谢。

解决方法

只需要一些语法调整,

FG.'urn:ExternalReqForApprovalInput_Item'.'urn:item'.'urn:HeaderExtrinsics'.Extrinsics.Extrinsic[0].value = "NEW"

您必须在必要时指定命名空间

注意,当你解析时,FG 成为文档的根,所以不要再次指定 urn:ExternalReqForApprovalImportRequest

我假设您正在尝试更新文本节点值

还要注意 Extrinsic 将是一个节点数组,所以你必须通过索引来引用它

,

我终于按照你在命名空间中的建议解决了!

import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import java.lang.String;
import groovy.util.XmlSlurper
import groovy.xml.XmlUtil

def Message processData(Message message) {
    
    map = message.getProperties();
    value = map.get("PRRefID");

    Reader reader = message.getBody(Reader)
    def root = new XmlParser().parse(reader)

if(value == "") {
    root.'urn:ExternalReqForApprovalInput_Item'.'urn:item'.'urn:Operation'[0].value = "NEW"
}
    message.setBody(XmlUtil.serialize(root))
    return message;
}

谢谢。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...