2013-10-18 22 views
0

我目前正在使用Spring Integration实现一些导入/导出机制,总而言之,它很好,但似乎在我不了解的功能上存在差距:使用Spring集成读取/写入XML文件

Spring Integration File轮询目录,写入文件,......我可以用它来查询目录,并得到一个Message<File>每个文件我感兴趣的

Spring Integration XML处理Document对象,应用XPath,XSLT,...我可以用它来分析XML文档,使用XPath丰富页眉,分割文档,...

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

  • 考虑到其中的XML文件将被删除我想
  • 给定一个通道,它包含在它每个文件Message<Document>的频道目录与Message<Document>我想要一个将每个写入文件的配置。

Marshallers/Unmarshallers 似乎是正是我要找的(或至少把我中途到byte[]),但他们似乎只能够转化Document向/从POJO通过一些映射框架。

为了解析我可以帮自己这个简单的类:

​​

但我还没有找到合适的配对件本我不能相信,Spring集成已经不配备此平凡的能力内置。

我错过了什么?

回答

1

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

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

+0

对不起,也许我很密集,但我仍然不明白:我必须自己定义一个这种类型的bean吗?我理想地寻找一些简单的配置(可能带有integration-xml名称空间)或者我可以用作服务激活器的单个表达式。 –

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,当然。

我是很确定这不是最好的解决方案(这就是为什么我首先问这个问题),但它适用于我。