NiFi中使用EvaluateXPath处理器提取XML所有同标签Id值
在NiFi中使用EvaluateXPath提取SOAP XML中所有的值
没问题,我来帮你解决这个问题。你遇到的核心问题是EvaluateXPath处理器的默认行为只返回第一个匹配项,再加上命名空间的小坑,导致你没法一次性拿到所有Id值。下面是具体的解决方案,完全用EvaluateXPath就能搞定:
你需要解析的SOAP XML示例:
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Header> </soap:Header> <soap:Body> <store-Ids> <Id>69E32281-0484</Id> <Id>3002AFCD-B494</Id> <Id>2C9E17AC-9D97</Id> <Id>98E8EB10-7D6A</Id> <Id>F8D5F93C-1455</Id> <Id>98655C3F-B58C</Id> <Id>8AE4FD0A-6000</Id> <Id>E56FE4CA-0D83</Id> </store-Ids> </soap:Body> </soap:Envelope>
1. 解决命名空间问题
你的XML里//Id找不到匹配(这就是你返回空集合的原因)。稳妥的写法是用local-name()忽略命名空间干扰:
//*[local-name()='Id']/text()
2. 修改处理器配置,返回所有值(字符串形式)
默认情况下,EvaluateXPath只会返回第一个匹配的结果,你需要调整三个关键属性:
- Return Type:设置为
String - Multiple Values Behavior:选择
Concatenate Values - Value Separator:输入你想要的分隔符,比如
,(逗号加空格)
配置完成后,处理器会把所有69E32281-0484, 3002AFCD-B494, 2C9E17AC-9D97, 98E8EB10-7D6A, ...
3. 生成JSON数组格式(可选)
如果你需要数组形式(方便后续Web服务调用的参数处理),可以切换到XPath 2.0(NiFi原生支持这个版本),用string-join函数直接生成JSON数组字符串:
- 在EvaluateXPath处理器中设置XPath Version为
2.0 - 使用以下XPath表达式:
concat('[", string-join(//*[local-name()='Id']/text(), '", "'), '"]')
执行后会得到标准JSON数组:["69E32281-0484", "3002AFCD-B494", "2C9E17AC-9D97", ...]
为什么你之前的表达式不行?
//*[local-name()='Id']/text()只返回第一个:因为默认Multiple Values Behavior是Return First Value,处理器只会取第一个匹配项//Id返回空:大概率是因为元素继承了父元素的默认命名空间(你的XML片段可能未完整展示),用 local-name()可以绕过命名空间匹配的问题
内容的提问来源于stack exchange,提问作者user4321
相关产品推荐
相关产品推荐

