NiFi:使用EvaluateXpath处理器获取XML中相同标签的所有元素

时间:2018-05-11 15:55:01

标签: xml xml-parsing apache-nifi hortonworks-dataflow

尝试在NiFi中解析下面的xml,并希望解析所有ID并为每个id进行多个Web服务调用。

<?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>

有没有办法解析Id标签内的所有id?作为数组(69E32281-0484,3002AFCD-B494 .............)或作为字符串(69E32281-0484 3002AFCD-B4942C9E17AC-9D97 ........... ....)使用Evaluate-XPath或Evaluate-xQuery处理器?

//*[local-name()='Id']/text() -------- This gives me only the 1st id. and 
//*[local-name()='Id'][2]/text() ------- This gives the 2nd id and so on....
//Id -------------------------------- This returns "Empty string set"  

因为Ids的数量将是动态的。不可能像[0],[1],[2] ........那样硬编码计数器值来获取每个id的值。

PS:还有很多其他方法可以在NiFi中完成这项工作。但是想知道是否有一种方法可以使用EvaluateXpath处理器读取XML并将所有id标记值作为数组或文本获取。

相关链接

1)https://community.hortonworks.com/questions/101922/how-to-use-evaluatexpath-to-get-xml-roots-attribut.html

2)https://community.hortonworks.com/questions/140605/evaluatexpath-cant-return-multiple-node-values.html

1 个答案:

答案 0 :(得分:4)

目前,EvaluateXPath仅允许Nodeset中的单个元素,即使目标是flowfile-content也是如此。我已经写了一个改进Jira(NIFI-5187)来涵盖对具有多个元素的Nodesets的支持。

作为一种变通方法,您可以将EvaluateXQuery与//*/Id一起使用,它将为您的每个ID发出一个流文件。然后,您可以单独处理每个,调用您喜欢的任何Web服务。