繁体   English   中英

使用 Spring 集成读取/写入 XML 文件

[英]Reading/Writing XML Files with Spring Integration

我目前正在使用 Spring Integration 实现一些导入/导出机制,总而言之,它进行得很顺利,但似乎在我不理解的功能方面存在差距:

有用于轮询目录、写入文件的Spring 集成文件……我可以使用它来轮询目录并为我感兴趣的每个文件获取Message<File>

有用于处理Document对象的Spring Integration XML ,应用 XPath,XSLT,......我可以用它来分析 XML 文档,使用 XPath 丰富标题,拆分文档,......

我缺少的是两者之间的联系:

  • 给定一个将放置 XML 文件的目录,我想要一个包含其中每个文件的Message<Document>的通道
  • 给定一个带有Message<Document>的通道,我想要一个将每个通道写入文件的配置。

Marshallers/Unmarshallers似乎正是我正在寻找的(或者至少让我找到了一个byte[] ),但它们似乎只能通过某种映射框架将Document转换为 POJO 或从 POJO 转换。

对于解析,我可以通过这个简单的类来帮助自己:

public class FileToDocumentTransformer extends AbstractFilePayloadTransformer<Document> {
    @Override
    protected Document transformFile(File file) throws Exception {
        return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
    }
}

但是我还没有找到合适的对策我无法相信 Spring Integration 还没有内置这种微不足道的能力。

我错过了什么?

请参阅DefaultXmlPayloadConverter.convertToDocument 该转换器在许多端点内部使用(特别是 XPath,但其他端点也是如此)。 它可以处理文件和字符串负载。 您也可以直接将其作为转换器调用。

有关更多信息,请参阅spring-integration-xml 项目中transformer包。

我最终写了这个类:

public class DocumentToBytesTransformer {
    public byte[] transform(Document document) throws Exception {
        Transformer tr = TransformerFactory.newInstance().newTransformer();
        tr.setOutputProperty(OutputKeys.INDENT, "yes");
        tr.setOutputProperty(OutputKeys.METHOD, "xml");
        tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        tr.transform(new DOMSource(document), new StreamResult(baos));
        return baos.toByteArray();
    }
}

使用此配置:

<int:service-activator method="transform">
    <bean class="package.DocumentToBytesTransformer"/>
</int:service-activator>

对我来说,这是在<chain> ,否则你当然需要input-channeloutput-channel

很确定这不是最好的解决方案(这就是我首先提出这个问题的原因),但它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM