我正在尝试在Groovy中保存一个带有xml的ID和描述的哈希表,但无法使我的工作代码获得更深层次的ID,目前我只能正确地映射描述。
代码
import com.sap.gateway.ip.core.customdev.util.Message
import java.util.HashMap
import java.io.*
import groovy.xml.*
def body = message.getBody(java.io.Reader)
HashMap<Integer, String> hmap = new HashMap<Integer, String>()
def Root = new XmlSlurper().parse(body)
Root.ExternalReqForApprovalInput_Item.item.ExternalReqLineItems.item.each {
try {
hmap.put(it.ItemDescription.text().toString(),it.LineExtrinsics.Extrinsics.Extrinsic.@InternalID);
}
catch (Exception ex) {
//put relevant exception handling here
}
}XML:
<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>Line 1</urn:Name>
<urn:Operation>NEW</urn:Operation>
<urn:ExternalReqLineItems>
<urn:item>
<urn:ExternalLineNumber>2</urn:ExternalLineNumber>
<urn:ItemDescription>TEST DESCRIPTION 1</urn:ItemDescription>
<urn:Quantity>1.00</urn:Quantity>
<urn:LineExtrinsics>
<Extrinsics>
<Extrinsic name="InternalID">7000083</Extrinsic>
</Extrinsics>
</urn:LineExtrinsics>
</urn:item>
</urn:ExternalReqLineItems>
</urn:item>
<urn:item>
<urn:Name>Line 2</urn:Name>
<urn:Operation>NEW</urn:Operation>
<urn:ExternalReqLineItems>
<urn:item>
<urn:ExternalLineNumber>2</urn:ExternalLineNumber>
<urn:ItemDescription>TEST DESCRIPTION 2</urn:ItemDescription>
<urn:Quantity>1.00</urn:Quantity>
<urn:LineExtrinsics>
<Extrinsics>
<Extrinsic name="InternalID">7000084</Extrinsic>
</Extrinsics>
</urn:LineExtrinsics>
</urn:item>
</urn:ExternalReqLineItems>
</urn:item>
</urn:ExternalReqForApprovalInput_Item>
</urn:ExternalReqForApprovalImportRequest>从名为InternalID的外部变量中获取值的正确方法是什么?
预期样本为:
7000083-测试描述1
7000084-测试说明2
谢谢
发布于 2021-01-26 18:59:06
以下代码:
import groovy.xml.*
def data = '''\
<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>Line 1</urn:Name>
<urn:Operation>NEW</urn:Operation>
<urn:ExternalReqLineItems>
<urn:item>
<urn:ExternalLineNumber>2</urn:ExternalLineNumber>
<urn:ItemDescription>TEST DESCRIPTION 1</urn:ItemDescription>
<urn:Quantity>1.00</urn:Quantity>
<urn:LineExtrinsics>
<Extrinsics>
<Extrinsic name="InternalID">7000083</Extrinsic>
</Extrinsics>
</urn:LineExtrinsics>
</urn:item>
</urn:ExternalReqLineItems>
</urn:item>
<urn:item>
<urn:Name>Line 2</urn:Name>
<urn:Operation>NEW</urn:Operation>
<urn:ExternalReqLineItems>
<urn:item>
<urn:ExternalLineNumber>2</urn:ExternalLineNumber>
<urn:ItemDescription>TEST DESCRIPTION 2</urn:ItemDescription>
<urn:Quantity>1.00</urn:Quantity>
<urn:LineExtrinsics>
<Extrinsics>
<Extrinsic name="InternalID">7000084</Extrinsic>
</Extrinsics>
</urn:LineExtrinsics>
</urn:item>
</urn:ExternalReqLineItems>
</urn:item>
</urn:ExternalReqForApprovalInput_Item>
</urn:ExternalReqForApprovalImportRequest>
'''
def xml = new XmlSlurper().parseText(data)
// items is a Map<String, String>
def items = xml.ExternalReqForApprovalInput_Item.item.findAll { node ->
node.ExternalReqLineItems.item.LineExtrinsics.Extrinsics.Extrinsic.@name == "InternalID"
}.collectEntries { node ->
node.ExternalReqLineItems.item.with {
[LineExtrinsics.Extrinsics.Extrinsic.text(), ItemDescription.text()]
}
}
println items运行时,打印:
─➤ groovy solution.groovy
[7000083:TEST DESCRIPTION 1, 7000084:TEST DESCRIPTION 2]findAll将遍历项目并查找外部名称等于"InternalID“的所有项目节点。对于这些节点,collectEntries会将列表(项目节点)转换为一个映射,其中键是7000084字符串,值是ItemDescription字符串。
如果您希望将连接的字符串作为结果而不是映射,则可以这样做:
def items = xml.ExternalReqForApprovalInput_Item.item.findAll { node ->
node.ExternalReqLineItems.item.LineExtrinsics.Extrinsics.Extrinsic.@name == "InternalID"
}.collect { node ->
node.ExternalReqLineItems.item.with {
"${LineExtrinsics.Extrinsics.Extrinsic.text()}-${ItemDescription.text()}"
}
}
println items(注意,我们现在使用的是collect
它在运行时将打印:
─➤ groovy solution.groovy
[7000083-TEST DESCRIPTION 1, 7000084-TEST DESCRIPTION 2]其中,items现在是由连字符-连接的键和值的List<String>。
https://stackoverflow.com/questions/65894843
复制相似问题