首页 > 解决方案 > Nifi:转换 xml:带有 groovy 脚本的错误

问题描述

我需要 Nifi 1.5 中的隐蔽 xml 文件。我尝试在 ExeccuteScript 处理器中执行此脚本:

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)

并且输出流文件为空。在本地这部分工作:

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()

为什么输出文件是空的?

标签: groovyapache-nifi

解决方案


我错过了transformer.transform(source, result) 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)

推荐阅读