Groovy-通过属性过滤XML有效负载的xpath

问题描述

我有一个通用的代码,可以接受xpath表达式并找到节点(XML和JSON)的值,但是我无法按属性进行过滤。以下是我的代码,请给我帮助?

def message = '''
<payload>
    <division name="DivisionCodes">
        <param name="DivisionCode">FFM-VKM</string>
        <param name="DivisionGroupCode">FFM</string>
        <param name="DivisionCountryCode">DE</string>
    </division>
</payload>
'''
def xpathEx='*/param[@name="DivisionCountryCode"]'
def result = ''
if(xpathEx) {
    def gPaths = xpathEx?.split(",") as LinkedList
    def extractedData=[:]
    gPaths.eachWithIndex { String entry,int idx ->
        def inputData = ''
        def headerKey = ''
        def path = entry?.replace('/','.')?.replace(':','')?.split('\\.') as LinkedList
        if (path) {
            if (message.trim().charat(0) == '<') {
                inputData = new XmlSlurper().parseText(message)
            }
            path.forEach({ inputData = inputData."${it}" })
        }
        extractedData.put(path.getLast().toString(),inputData)
    }
    if(extractedData.isEmpty()) {
        result = ' '
    } else {
        result = ',XPath reference: '+extractedData?.toMapString()
    }                   
}
println result

我有兴趣获取属性为“ DivisionGroupCode”的param子节点的值。我的xpath表达式只能按子节点过滤。

正确的xpathEx应该是什么?或应该如何纠正可以将xpathEx作为参数并在任何XML有效负载上处理的常规代码

解决方法

如果您唯一的要求是您所说的:“我有兴趣获取属性为'DivisionGroupCode'的param子节点的值”, 然后这将工作。 但是,您的XML无效,结束标记</string>应该为</param>

def message = '''
<payload>
    <division name="DivisionCodes">
        <param name="DivisionCode">FFM-VKM</param>
        <param name="DivisionGroupCode">FFM</param>
        <param name="DivisionCountryCode">DE</param>
    </division>
</payload>
'''

def payload = new XmlSlurper().parseText(message)

def name = payload.depthFirst().find { param ->
    param.@name == 'DivisionGroupCode'
}

println name
,
array([[2,3],[5,6],[8,9]])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...