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

时间:2013-10-18 17:22:24

标签: java xml file spring-integration

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

Spring Integration File用于轮询目录,写入文件,...我可以使用它来轮询目录并为我感兴趣的每个文件获取Message<File>

Spring Integration XML用于处理Document个对象,应用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还没有内置这种琐碎的能力。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

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

有关详细信息,请参阅spring-integration-xml project中的transformer包。

答案 1 :(得分:0)

我最后写了这堂课:

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

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