0

我有一个大致如下的 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>

这会为每个发票标签创建文件,但我不知道如何从那里继续获取文件中的标题。

编辑:

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

4

2 回答 2

1

我自己刚开始使用 Smooks。但是...您的问题听起来与此相同:http ://www.smooks.org/mediawiki/index.php?title=V1.5:Smooks_v1.5_User_Guide#Routing_to_File

您必须提供完整的输出 FTL 格式,我猜这是使用通用工具的缺点。数据映射通常包含很多感觉像是冗余的东西,解决这个问题的一种方法是利用约定,但必须将其构建到框架中。

于 2012-04-24T12:15:56.583 回答
0

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

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

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

于 2012-03-01T15:10:40.410 回答