2012-03-01 24 views
0

我有一个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配置文件。

回答

1

我刚从Smooks开始。然而......你的问题听起来完全相同:http://www.smooks.org/mediawiki/index.php?title=V1.5:Smooks_v1.5_User_Guide#Routing_to_File

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

+0

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

0

我不知道的Smooks,但最简单的解决方案(表现欠佳)会(创建第N个文件):

  • 复制整个XML结构
  • 删除所有发票标签,但第一个

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

+0

XML文件的大小可能是千兆字节,这就是为什么我们使用smooks来拆分它,因为它使用的事件模型不会将整个文件保留在内存中。 – palto 2012-03-01 15:15:29