我有這些 xml 檔案,我可以從 ftp 獲取它們(帶有串列和獲取 ftp 處理器)。我想從 xml 檔案中獲取值并將檔案替換為這些值,因為它是 csv 。(并使用 putFtp 處理器將它們放回 ftp)
所需的輸出是這樣的:
{"foodate":"somedate","name":"fooid1_foovalue","value":some-numbers}
{"foodate":"somedate","name":"fooid1_metrics","value":some-metrics}
.
.
.
{"foodate":"somedate","name":"fooid2_foovalue","value":some-numbers}
.
.
.
因此,對于每個 id,首先寫入 foodate 屬性,然后寫入 id1、sample-attribute 1、id1、sample-attribute 2 等。
但是,每次我都不知道名稱或屬性有多少。只有第一個示例屬性是食物。知道如何進行嗎?我嘗試使用 executeScript 處理器和 js,但它似乎無法識別 DOMParser() 等。
<?xml version="1.0" encoding="ISO-8859-1"?>
<Document Version="2">
<ExportData lowerBound="2021/11/24 16:58:26" upperBound="2021/11/24 22:58:26">
<Site name="name" f="">
<Kapta fooid1="some-number">
<Infos>
<Info>
<EndPoint foo="value-name" />
</Info>
</Infos>
<Samples ordering="desc">
<Sample foodate="some-date" foovalue="some-numbers" metrics="some-metrics" metrics2="metrics-again" value="numbers5" te="numbers" />
<Sample foodate="some-date" foovalue="some-numbers" foom="some-metrics" metrics453="metrics-again" otherattribut="numbers5" att345="numbers" morevalues="numbers" foohdeiurf="numbers" hello="numbers"/>
</Samples>
</Kapta>
<Kapta fooid2="some-number">
<Infos>
<Info>
<EndPoint foo="value-name" />
</Info>
</Infos>
<Samples ordering="desc">
<Sample foodate="some-date" foovalue="some-numbers" metrics="some-metrics" metrics2="metrics-again" value="numbers" te="numbersagain" />
<Sample foodate="some-date" foo="some-numbers" metrics="some-metrics" metrics2="metrics-again" value="numbers" te="numbers" />
<Sample foodate="some-date" attr="some-numbers" someothermetrics="some-metrics" metr="metrics-again" anothervalue="numbers" />
</Samples>
</Kapta>
</Site>
</ExportData>
</Document>
Thanks a lot for your time and effort!
uj5u.com熱心網友回復:
您可以使用 groovy xml 決議器庫。根據您的需要有很多選擇,請檢查這個
這是一個實驗代碼,它從傳入的流檔案的內容中獲取 xml,并將一些提取內容輸出為 json 串列。您可以根據您的要求開發它
請注意,此代碼可能不是生產級的。有關Nifi 中 Groovy 的更多資訊,請參閱ExecuteScript說明書
import org.apache.nifi.flowfile.FlowFile;
import org.apache.commons.io.IOUtils
import org.apache.nifi.processor.io.InputStreamCallback
import org.apache.nifi.processor.io.StreamCallback
import java.nio.charset.StandardCharsets
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import groovy.xml.dom.DOMCategory
import groovy.json.JsonGenerator
def flowFile
try {
flowFile = session.get()
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = null
session.read(flowFile, {inputStream ->
doc = dBuilder.parse(inputStream)
} as InputStreamCallback)
def root = doc.documentElement
def sb = new StringBuilder()
def jsonGenerator = new JsonGenerator.Options().disableUnicodeEscaping().build()
use(DOMCategory) {
root['ExportData']['Site']['Kapta']['Samples']['*'].findAll { node ->
def data = new LinkedHashMap()
data.foodate = node['@foodate']
data.foovalue = node['@foovalue']
sb.append(jsonGenerator.toJson(data))
sb.append('\n')
}
}
flowFile = session.write(flowFile, {inputStream, outputStream ->
outputStream.write(sb.toString().getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
session.transfer(flowFile, REL_SUCCESS)
} catch (Exception e) {
log.error('',e)
session.transfer(flowFile, REL_FAILURE)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/383950.html
標籤:xml xml解析 apache-nifi
下一篇:有效的XSL轉換不會在c#中決議
