Я конвертирую CSV в XML, используя процессор ConvertRecord, передав схему avro. Поскольку в NiFi 1.5 нет XMLRecordSetWriter, я использую ScriptedRecordSetWriter. Я получил образец сценария xml Writer Groovy от nifi github
https://github.com/apache/nifi/blob/rel/nifi-1.5.0/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/groovy/test_record_writer_inline.groovy
Я хочу настроить xml, например пользовательский тег записи, родительский тег и удаление пустых тегов.
Вход CSV
MovieID,Year,Genre
1,2000,Action
2,1997,Action|Adventure
Токовый выход с использованием образца кода
<record>
<MovieID>1</MovieID>
<Year>2000</Year>
<Genre>Action</Genre>
</record>
<record>
<MovieID>2</MovieID>
<Year>1997</Year>
<Genre>Action|Adventure</Genre>
</record>
Ожидаемый результат
<MovieList>
<Movie>
<MovieID>1</MovieID>
<Year>2000</Year>
<Genre>Action</Genre>
</Movie>
<Movie>
<MovieID>2</MovieID>
<Year>1997</Year>
<Genre>Action|Adventure</Genre>
</Movie>
</MovieList>
Вот пример кода от nifi github
import groovy.xml.MarkupBuilder
import org.apache.nifi.controller.AbstractControllerService
import org.apache.nifi.flowfile.FlowFile
import org.apache.nifi.logging.ComponentLog
import org.apache.nifi.schema.access.SchemaNotFoundException
import org.apache.nifi.serialization.RecordSetWriter
import org.apache.nifi.serialization.RecordSetWriterFactory
import org.apache.nifi.serialization.WriteResult
import org.apache.nifi.serialization.record.Record
import org.apache.nifi.serialization.record.RecordSchema
import org.apache.nifi.serialization.record.RecordSet
import org.apache.nifi.stream.io.NonCloseableOutputStream
class GroovyRecordSetWriter implements RecordSetWriter {
private int recordCount = 0;
private final OutputStream out;
public GroovyRecordSetWriter(final OutputStream out) {
this.out = out;
}
@Override
WriteResult write(Record r) throws IOException {
new OutputStreamWriter(new NonCloseableOutputStream(out)).with {osw ->
new MarkupBuilder(osw).record {
r.schema.fieldNames.each {fieldName ->
"$fieldName" r.getValue(fieldName)
}
}
}
recordCount++;
WriteResult.of(1, [:])
}
@Override
String getMimeType() {
return 'application/xml'
}
@Override
WriteResult write(final RecordSet rs) throws IOException {
int count = 0
new OutputStreamWriter(new NonCloseableOutputStream(out)).with {osw ->
new MarkupBuilder(osw).recordSet {
Record r
while (r = rs.next()) {
count++
record {
rs.schema.fieldNames.each {fieldName ->
"$fieldName" r.getValue(fieldName)
}
}
}
}
}
WriteResult.of(count, [:])
}
public void beginRecordSet() throws IOException {
}
@Override
public WriteResult finishRecordSet() throws IOException {
return WriteResult.of(recordCount, [:]);
}
@Override
public void close() throws IOException {
}
@Override
public void flush() throws IOException {
}
}
class GroovyRecordSetWriterFactory extends AbstractControllerService implements RecordSetWriterFactory {
@Override
RecordSchema getSchema(Map<String, String> variables, RecordSchema readSchema) throws SchemaNotFoundException, IOException {
return null
}
@Override
RecordSetWriter createWriter(ComponentLog logger, RecordSchema schema, OutputStream out) throws SchemaNotFoundException, IOException {
return new GroovyRecordSetWriter(out)
}
}
writer = new GroovyRecordSetWriterFactory()
Я новичок в заводной и нифи. Я искал любой пример, который реализовал то же самое, но не смог найти ни одного. Любая помощь или направление приветствуется. Спасибо !!