Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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 如何使用smooks将xml拆分为标题和项目?_Java_Xml_Smooks - Fatal编程技术网

Java 如何使用smooks将xml拆分为标题和项目?

Java 如何使用smooks将xml拆分为标题和项目?,java,xml,smooks,Java,Xml,Smooks,我有一个大致如下的xml文件: <batch> <header> <headerStuff /> </header> <contents> <timestamp /> <invoices> <invoice> <invoiceStuff />

我有一个大致如下的xml文件:

<batch>
    <header>
        <headerStuff />
    </header>
    <contents>
        <timestamp />
        <invoices>
            <invoice>
                <invoiceStuff />
            </invoice>
            <!-- Insert 1000 invoice elements here -->
        </invoices>
    </contents>
</batch>

我想将该文件拆分为1000个文件,其中包含相同的headerStuff和一张发票。Smooks文档对转换的可能性感到非常自豪,但不幸的是,我不想这样做

我找到的唯一方法就是在freemarker中重复整个结构。但这感觉像是重复了不必要的结构。标题有30个不同的标签,因此也会涉及大量的工作

我目前拥有的是:

<?xml version="1.0" encoding="UTF-8"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"    
    xmlns:calc="http://www.milyn.org/xsd/smooks/calc-1.1.xsd"
    xmlns:frag="http://www.milyn.org/xsd/smooks/fragment-routing-1.2.xsd"
    xmlns:file="http://www.milyn.org/xsd/smooks/file-routing-1.1.xsd">

    <params>
        <param name="stream.filter.type">SAX</param>
    </params>

    <frag:serialize fragment="INVOICE" bindTo="invoiceBean" />

    <calc:counter countOnElement="INVOICE" beanId="split_calc" start="1" />

    <file:outputStream openOnElement="INVOICE" resourceName="invoiceSplitStream">
        <file:fileNamePattern>invoice-${split_calc}.xml</file:fileNamePattern>
        <file:destinationDirectoryPattern>target/invoices</file:destinationDirectoryPattern>
        <file:highWaterMark mark="10"/>
    </file:outputStream>

    <resource-config selector="INVOICE">
        <resource>org.milyn.routing.io.OutputStreamRouter</resource>
        <param name="beanId">invoiceBean</param>
        <param name="resourceName">invoiceSplitStream</param>
        <param name="visitAfter">true</param>
    </resource-config>

</smooks-resource-list>

萨克斯
发票-${split_calc}.xml
目标/发票
org.milyn.routing.io.OutputStreamRouter
冰海
发票拆分流
真的
这将为每个发票标签创建文件,但我不知道如何从那里继续获取文件中的标题

编辑:


解决方案必须使用Smooks。我们在应用程序中使用它作为通用拆分器,只需为不同类型的输入文件创建不同的smooks配置文件。

我不知道smooks,但最简单的解决方案(性能较差)是(创建第n个文件):

  • 复制整个xml结构
  • 删除除第n个发票标签以外的所有发票标签

我不知道如何在smooks中做到这一点,这只是一个想法。在这种情况下,您不需要在freemarker模板中复制xml的结构。

我自己刚开始使用Smooks。然而。。。您的问题听起来与此相同:


您必须提供完整的输出FTL格式,我想这是使用通用工具的缺点。数据映射通常包含很多感觉像冗余的内容,一种解决方法是利用约定,但这必须内置到框架中。

XML文件的大小可以是千兆字节,这就是为什么我们使用smooks来拆分它,因为它使用的事件模型不会将整个文件保存在内存中。我最终选择了按照您的建议在FTL模板中的拆分之外重新创建xml内容。这不是我要找的,而且工作量很大,容易出错,但我找不到其他任何东西(这是一个很大的模式)。如果我需要多次这样做,也许我会创建一些用于Smook的盒式磁带来支持这样的情况。