问题描述
我有一个通用的代码,可以接受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]])