我有一个XML文件大致是这样的:如何使用smooks将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配置文件。
我最终选择重新创建FTL模板之外的xml内容,就像您建议的一样。这不是我正在寻找的东西,而且工作很多,容易出错,但我找不到任何其他东西(这是一个很大的模式)。如果我需要多次执行此操作,也许我会创建一些磁带盒以支持这些案例。 – palto 2012-05-09 15:11:40