2016-02-04 38 views
0

TL; DR:我有一個多行CSV,我想逐行處理併爲每行生成不同的XML。如何將CSV的每一行處理爲單個XML輸出 - WSO2/Smooks

我有以下CSV:

Chathuri,Wimalasena,Female,25,SriLanka 
Saminda,Wijerathne,Male,26,SriLanka 
Dakshitha,Rathnayaka,Female,24,SriLanka 
Harsha,Martin,Male,24,SriLanka 

目前我使用的Smooks和做如下改造:

<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
     <people> 
       <person> 
       <lastname>Wimalasena</lastname> 
       <firstname>Chathuri</firstname> 
       <gender>Female</gender> 
       <age>25</age> 
       <country>SriLanka</country> 
      </person> 
      <person> 
       <lastname>Wijerathne</lastname> 
       <firstname>Saminda</firstname> 
       <gender>Male</gender> 
       <age>26</age> 
       <country>SriLanka</country> 
      </person> 
      <person> 
       <lastname>Rathnayaka</lastname> 
       <firstname>Dakshitha</firstname> 
       <gender>Female</gender> 
       <age>24</age> 
       <country>SriLanka</country> 
      </person> 
      <person> 
       <lastname>Martin</lastname> 
       <firstname>Harsha</firstname> 
       <gender>Male</gender> 
       <age>24</age> 
       <country>SriLanka</country> 
      </person> 
     </people> 
    </soapenv:Body> 
</soapenv:Envelope> 

的問題是:我想是這樣的:

<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
     <people> 
      <person> 
       <lastname>Wimalasena</lastname> 
       <firstname>Chathuri</firstname> 
       <gender>Female</gender> 
       <age>25</age> 
       <country>SriLanka</country> 
      </person> 
     </people> 
    </soapenv:Body> 
</soapenv:Envelope> 


<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
     <people> 
      <person> 
       <lastname>Wijerathne</lastname> 
       <firstname>Saminda</firstname> 
       <gender>Male</gender> 
       <age>26</age> 
       <country>SriLanka</country> 
      </person> 
     </people> 
    </soapenv:Body> 
</soapenv:Envelope> 

我smook.xml:

<?xml version="1.0" encoding="UTF-8"?><smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:csv="http://www.milyn.org/xsd/smooks/csv-1.2.xsd" xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd"> 
    <params> 
    <param name="stream.filter.type">SAX</param> 
    <param name="inputType">input.csv</param> 
    <param name="input.csv" type="input.type.actived">File:/C:\Users\victor.viola\Desktop\test.csv</param> 
    <param name="default.serialization.on">true</param> 
    </params> 
    <csv:reader fields="name,surname,gender,age,country"/> 
    <ftl:freemarker applyOnElement="#document"> 
    <ftl:template><![CDATA[<?xml version="1.0" encoding="UTF-8"?> 
<people> 
    <#list .vars["csv-set"]["csv-record"] as csv_record> 
    <person> 
     <lastname>${.vars["csv_record"]["surname"]}</lastname>   
     <firstname>${.vars["csv_record"]["name"]}</firstname>   
     <gender>${.vars["csv_record"]["gender"]}</gender>   
     <age>${.vars["csv_record"]["age"]}</age>   
     <country>${.vars["csv_record"]["country"]}</country>   
    </person> 
    </#list>  
</people>]]></ftl:template> 
    <param name="rootElementName">people</param> 
    <param name="modelSrc">File:/C:\Users\victor.viola\Desktop\example.xsd</param> 
    <param name="modelSrcType">XSD</param> 
    <param name="messageType">XML</param> 
    <param name="templateDataProvider">input</param> 
    </ftl:freemarker> 
    <resource-config selector="#document"> 
    <resource>org.milyn.delivery.DomModelCreator</resource> 
    </resource-config> 
</smooks-resource-list> 
+0

無關的問題,但不是'.vars [「csv_record」] [「surname」]'你可以寫'csv_record.surname'。 '.vars [「csv-set」] [「csv-record」]'因爲'-':'csv \ -set.csv \ -record'更復雜('\ -'需要FreeMarker 2.3.22+) 。 – ddekany

+0

謝謝你的提示=) –

回答

1

隨着Smooks的,你可以將消息路由到文件或JMS隊列。

請看看這個樣本,上面寫着流模式文件並拆分它的內容到文件或JMS消息(它工作在固定長度但這是CSV一樣,只是使用CSV:讀卡器)

代理服務:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" name="VFSProxy" transports="vfs" startOnLoad="true" trace="disable"> 
    <target> 
     <inSequence> 
      <property name="DISABLE_SMOOKS_RESULT_PAYLOAD" value="true"/> 
      <smooks config-key="SmooksSplitFileFL"> 
      <!--smooks config-key="SmooksSplitJMSFL"--> 
       <input type="text"/> 
       <output type="xml"/> 
      </smooks> 
     </inSequence> 
    </target> 
    <parameter name="transport.vfs.FileURI">vfs:file:///C:/In</parameter> 
    <parameter name="transport.vfs.FileNamePattern">.*.fl</parameter> 
    <parameter name="transport.vfs.ContentType">text/plain</parameter> 
    <parameter name="transport.vfs.Streaming">true</parameter> 
    <parameter name="transport.PollInterval">15</parameter> 
    <parameter name="transport.vfs.ActionAfterProcess">DELETE</parameter> 
    <parameter name="transport.vfs.ActionAfterFailure">DELETE</parameter> 
</proxy> 

的Smooks是拆分後的文件(本地入境,名字被用來命名的文件,所以,如果用相同的名字倍數行,你將有最後一個)

<?xml version="1.0" encoding="UTF-8"?> 
<localEntry xmlns="http://ws.apache.org/ns/synapse" key="SmooksSplitFileFL"> 
    <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd" xmlns:fl="http://www.milyn.org/xsd/smooks/fixed-length-1.3.xsd" xmlns:file="http://www.milyn.org/xsd/smooks/file-routing-1.1.xsd"> 
     <params> 
      <param name="stream.filter.type">SAX</param> 
      <param name="default.serialization.on">false</param> 
     </params> 
     <fl:reader fields="LASTNAME[2],FIRSTNAME[10]" skipLines="0"/> 
     <resource-config selector="record"> 
      <resource>org.milyn.delivery.DomModelCreator</resource> 
     </resource-config> 
     <file:outputStream openOnElement="record" resourceName="fileSplitStream"> 
      <file:fileNamePattern>${.vars["record"].LASTNAME}.xml</file:fileNamePattern> 
      <file:destinationDirectoryPattern>C:\Processed</file:destinationDirectoryPattern> 
      <file:highWaterMark mark="-1"/> 
     </file:outputStream> 
     <ftl:freemarker applyOnElement="record"> 
      <ftl:template>/repository/resources/smooks/RecordToXML.ftl</ftl:template> 
      <ftl:use> 
       <ftl:outputTo outputStreamResource="fileSplitStream"/> 
      </ftl:use> 
     </ftl:freemarker> 
    </smooks-resource-list> 
    <description/> 
</localEntry> 

的Smooks是分成JMS消息

<?xml version="1.0" encoding="UTF-8"?> 
<localEntry xmlns="http://ws.apache.org/ns/synapse" key="SmooksSplitJMSFL"> 
    <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd" xmlns:fl="http://www.milyn.org/xsd/smooks/fixed-length-1.3.xsd" xmlns:jms="http://www.milyn.org/xsd/smooks/jms-routing-1.2.xsd"> 
     <params> 
      <param name="stream.filter.type">SAX</param> 
      <param name="default.serialization.on">false</param> 
     </params> 
     <fl:reader fields="LASTNAME[2],FIRSTNAME[10]" skipLines="0"/> 
     <resource-config selector="record"> 
      <resource>org.milyn.delivery.DomModelCreator</resource> 
     </resource-config> 
     <jms:router routeOnElement="record" beanId="Person" destination="dynamicQueues/TestFL"> 
      <jms:connection factory="QueueConnectionFactory"/> 
      <jms:jndi contextFactory="org.apache.activemq.jndi.ActiveMQInitialContextFactory" providerUrl="nio://localhost:61616"/> 
      <jms:highWaterMark mark="-1"/> 
     </jms:router> 
     <ftl:freemarker applyOnElement="record"> 
      <ftl:template>/repository/resources/smooks/RecordToXML.ftl</ftl:template> 
      <ftl:use> 
       <ftl:bindTo id="Person"/> 
      </ftl:use> 
     </ftl:freemarker> 
    </smooks-resource-list> 
    <description/> 
</localEntry> 

模板(創建文件ESB_HOME /庫/資源/的Smooks/RecordToXML.ftl):

<#assign rec = .vars["record"]> 
<person> 
    <lastname>${rec.LASTNAME}</lastname> 
    <firstname>${rec.FIRSTNAME}</firstname> 
</person> 
+0

謝謝你,祝你有美好的一天。 –

+0

當我嘗試替換CSV閱讀器的FL時,我的文件就消失了,沒有任何反應,甚至沒有記錄。 LOL –

+0

在我的代理def中,ActionAfterProcess&failure是「DELETE」,所以我想你的配置有問題,並且文件被刪除。怎麼樣esb日誌? –

相關問題