0
votes

I need covert xml files in Nifi 1.5. I try execute this script in ExcecuteScript processor:

import groovy.xml.*
import javax.xml.transform.TransformerFactory
import javax.xml.transform.Transformer
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
import org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets
import org.apache.nifi.processor.io.StreamCallback
import java.io.StringWriter

flowFile = session.get()
if(!flowFile) return
session.write(flowFile, 
    {
        inputStream, outputStream ->      
            def xml = IOUtils.toString(inputStream, 'UTF-8')
            def reader = new StringReader(xml)
            def doc = DOMBuilder.parse(reader)
            def records = doc.documentElement
            TransformerFactory tFactory = TransformerFactory.newInstance();
            StringWriter writer = new StringWriter();
            Transformer transformer = tFactory.newTransformer();
            DOMSource source = new DOMSource(records);
            StreamResult result = new StreamResult(writer);
            String strString = writer.toString()
            outputStream.write(strString.getBytes(StandardCharsets.UTF_8))
    } as StreamCallback
)
session.transfer(flowFile, REL_SUCCESS)

And Output FlowFile is empty. In local this part working:

def xml = "<xml>...</xml>"
def reader = new StringReader(xml)
def doc = DOMBuilder.parse(reader)
def records = doc.documentElement
TransformerFactory tFactory = TransformerFactory.newInstance();
StringWriter writer = new StringWriter();
Transfor mer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(records);
StreamResult result = new StreamResult(writer);
String strString = writer.toString()

Why output file is empty?

1
i tried your local script on <xml><a>bbbbbbb</a></xml> and it also returns an empty string. so, please provide input data example. - daggett
and let me ask you a question: what is a purpose of converting xml-to-xml ? - daggett
I need add xml prolog in xml-files. - Антон Букреев

1 Answers

-1
votes

I missed the line transformer.transform(source, result) full script for Nifi:

import groovy.xml.*
import javax.xml.transform.TransformerFactory
import javax.xml.transform.Transformer
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
import org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets
import org.apache.nifi.processor.io.StreamCallback
import java.io.StringWriter

flowFile = session.get()
if(!flowFile) return
session.write(flowFile, 
    {
        inputStream, outputStream ->      
            def xml = IOUtils.toString(inputStream, 'UTF-8')
            def reader = new StringReader(xml)
            def doc = DOMBuilder.parse(reader)
            def records = doc.documentElement
            TransformerFactory tFactory = TransformerFactory.newInstance();
            StringWriter writer = new StringWriter();
            Transformer transformer = tFactory.newTransformer();
            DOMSource source = new DOMSource(records);
            StreamResult result = new StreamResult(writer);
            transformer.transform(source, result)
            String strString = writer.toString()
            outputStream.write(strString.getBytes(StandardCharsets.UTF_8))
    } as StreamCallback
)
session.transfer(flowFile, REL_SUCCESS)