[英]Reading/Writing XML Files with Spring Integration
我目前正在使用 Spring Integration 实现一些导入/导出机制,总而言之,它进行得很顺利,但似乎在我不理解的功能方面存在差距:
有用于轮询目录、写入文件的Spring 集成文件……我可以使用它来轮询目录并为我感兴趣的每个文件获取Message<File>
。
有用于处理Document
对象的Spring Integration XML ,应用 XPath,XSLT,......我可以用它来分析 XML 文档,使用 XPath 丰富标题,拆分文档,......
我缺少的是两者之间的联系:
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-channel
和output-channel
。
我很确定这不是最好的解决方案(这就是我首先提出这个问题的原因),但它对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.