2014-05-23 164 views
-2

我有如下缩短,当然还有反复的XML文件标记的敌人和:Python脚本来转换XML到csv

<file version=3.6 xmlns:xsi="http://ww.w3.org/2009/XMLSchemainstance"> 
    <Date>2014-05-12</Date> 
<creationTime>2014-05-12 :56:54</creationTime> 
<location>http://www.w.org/2009/XMLSchemainstance/output/official/.20140512.PNL.xml.gz</location> 
<contentType>nnn</contentType> 
<signOffBy>gft_test_fo</signOffBy> 
<signOffGroup>BRFPOOLNEW_SO</signOffGroup> 
<book> 
    <riskBook>BRFPOOL</riskBook> 
    <trade> 
     <tradeId>00000000000009752</tradeId> 
    <subTrade> 
     <riskTrade>00000000000009752</riskTrade> 
     <riskProductType>BOND_NF</riskProductType> 
     <reportCollection> 
     <report> 
     <valuationSource>RISK_ENGINE</valuationSource> 
     <reportName>BRZ_HGS_PPTCC</reportName> 
     <riskPoint> 
      <value>0.00</value> 
      <valueCcy>BRL</valueCcy> 
      </riskPoint> 
     </report> 
     <report> 
     <valuationSource>RISK_ENGINE</valuationSource> 
     <reportName>BRZ_HGS_PPTCC</reportName> 
     <riskPoint> 
      <value>0.00</value> 
      <valueCcy>BRL</valueCcy> 
      </riskPoint> 
     </report>   
     </reportCollection> 
     </subTrade> 
    </trade> 
    </book> 
</file> 

我想输出为CSV如下:

Date,creationTime,location,contentType,signOffBy,signOffGroup,riskBook,tradeId,riskTrade,riskProductType,reportName,valuationSource,reportName,value,valueCcy 
2014-05-12,2014-05-12 :56:54,http://ww.w3.org/2009/XMLSchemainstance/output/official/GLOBAL/GLOBAL_EM/BRFPOOL.20140512.PNL.xml.gz,nnn,gft_test_fo,BRFPOOLNEW_SO,BRFPOOL,00000000000009752,00000000000009752,BOND_NF,RISK_ENGINE,BRZ_HGS_PPTCC,0.00,BRL 
2014-05-12,2014-05-12 :56:54,http://ww.w3.org/2009/XMLSchemainstance/output/official/GLOBAL/GLOBAL_EM/BRFPOOL.20140512.PNL.xml.gz,PNL,gft_test_fo,BRFPOOLNEW_SO,BRFPOOL,00000000000009752,00000000000009752,BOND_NF,RISK_ENGINE,BRZ_HGS_PPTCC,0.00,BRL 

这里是我到目前为止的代码:

import xml.etree.ElementTree as etree 
root=etree.parse('./emp.xml').getroot() 
for b in zip(root.findall("book/trade/tradeId"),root.findall ("book/trade/subTrade/riskTrade"),root.findall("book/trade/subTrade/riskProductType"),root.findall("book/trade/subTrade/reportcollectin/report/valuationSource"),("book/trade/subTrade/reportcollectin/report/reportName"),("book/trade/subTrade/reportcollectin/report/refCurve"),("book/trade/subTrade/reportcollectin/report/riskPoint/value"),("book/trade/subTrade/reportcollectin/report/riskPoint/valueCcy") 
    print (",".join([x.text for x in b])) 

我没有得到我期望的输出,请帮助我。

+1

上面的代码会发生什么?你看到一个错误? – shaktimaan

+0

@shaktimaan我没有得到预期的输出 – user3669149

+0

请修复您的缩进并将其标记为代码 – DAXaholic

回答

2

除了在XML中的错误(有上<creationTime><file>没有结束标记)和Python的文件(有文件名没有结束报价和一些路径路由拼错像reportcollectin),你不能使用zip功能当涉及两个不同大小的列表时,结果始终是较低的长度,并且在搜索root.findall("book/trade/subTrade/reportCollection/report/refCurve")的代码中,这是一个空列表,最终结果也以空列表结尾。

最好的方法是首先获取主变量(日期,creationTime,creationTime),然后使用循环遍历书籍和报告。

+0

请发表您的代码 – user3669149

+0

请为我提供一个建议的Python代码,我对python非常陌生。 – user3669149