Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring集成读取/写入XML文件_Java_Xml_File_Spring Integration - Fatal编程技术网

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

Java 使用Spring集成读取/写入XML文件,java,xml,file,spring-integration,Java,Xml,File,Spring Integration,我目前正在使用Spring集成实现一些导入/导出机制,总的来说进展很顺利,但在功能方面似乎存在差距,我不了解: 有一个用于轮询目录、写入文件。。。我可以用它轮询一个目录,并为我感兴趣的每个文件获取一条消息 对于处理文档对象,可以使用XPath、XSLT等。。。我可以使用它来分析XML文档、使用XPath丰富标题、拆分文档等等 我缺少的是两者之间的联系: 给定一个XML文件将被丢弃到的目录,我想要一个通道,其中每个文件都包含一条消息 给定一个带有消息的频道,我想要一个将每个频道写入文件的配置

我目前正在使用Spring集成实现一些导入/导出机制,总的来说进展很顺利,但在功能方面似乎存在差距,我不了解:

有一个用于轮询目录、写入文件。。。我可以用它轮询一个目录,并为我感兴趣的每个文件获取一条
消息

对于处理
文档
对象,可以使用XPath、XSLT等。。。我可以使用它来分析XML文档、使用XPath丰富标题、拆分文档等等

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

  • 给定一个XML文件将被丢弃到的目录,我想要一个通道,其中每个文件都包含一条
    消息
  • 给定一个带有
    消息的频道
    ,我想要一个将每个频道写入文件的配置
封送拆收器/解封拆收器似乎正是我想要的(或者至少让我对
字节[]
有了一半了解),但它们似乎只能通过某种映射框架将
文档
转换为POJO或从POJO转换成POJO

对于解析,我可以使用以下简单类:

public class FileToDocumentTransformer extends AbstractFilePayloadTransformer<Document> {
    @Override
    protected Document transformFile(File file) throws Exception {
        return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
    }
}
公共类FileToDocumentTransformer扩展了AbstractFilePayloadTransformer{
@凌驾
受保护的文档转换文件(文件文件)引发异常{
返回DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(文件);
}
}
但我还没有找到一个合适的对策,我不能相信Spring集成还没有内置这种微不足道的功能


我缺少什么?

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


有关更多信息,请参阅中的
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>

对我来说,这是一个
,否则你当然需要
输入通道和
输出通道


我很确定这不是最好的解决方案(这就是为什么我一开始问这个问题),但它对我很有效。

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