首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy连接现有description标记中的ID和description

Groovy连接现有description标记中的ID和description
EN

Stack Overflow用户
提问于 2021-01-26 09:46:11
回答 1查看 27关注 0票数 0

我正在尝试在Groovy中保存一个带有xml的ID和描述的哈希表,但无法使我的工作代码获得更深层次的ID,目前我只能正确地映射描述。

代码

代码语言:javascript
复制
    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:

代码语言:javascript
复制
<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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-26 18:59:06

以下代码:

代码语言:javascript
复制
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

运行时,打印:

代码语言:javascript
复制
─➤ groovy solution.groovy
[7000083:TEST DESCRIPTION 1, 7000084:TEST DESCRIPTION 2]

findAll将遍历项目并查找外部名称等于"InternalID“的所有项目节点。对于这些节点,collectEntries会将列表(项目节点)转换为一个映射,其中键是7000084字符串,值是ItemDescription字符串。

如果您希望将连接的字符串作为结果而不是映射,则可以这样做:

代码语言:javascript
复制
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

它在运行时将打印:

代码语言:javascript
复制
─➤ groovy solution.groovy                                                                                          
[7000083-TEST DESCRIPTION 1, 7000084-TEST DESCRIPTION 2]

其中,items现在是由连字符-连接的键和值的List<String>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65894843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档