如何使用Python解析XML并转换为CSV

时间:2015-06-16 22:42:33

标签: python xml csv hadoop elementtree

我是Python编程的新手。我们最近进入了一个项目,我需要将XML文档转换为文本或CSV格式,以便我们可以将其加载到Hadoop并通过Impala将其呈现给用户。下面是一个示例XML,我正在寻找如下所示的输出格式。我讨厌直接寻求帮助,但由于这对我来说是全新的,请与专家联系。

示例XML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<GISF XMLNS="TOOL.COM">
   <HEADER>
      <FILE_NAME>TOY.xml</FILE_NAME>
      <DATE>20130611</DATE>
      <TIME>14:02:00</TIME>
   </HEADER>
<ISSUER>
   <ID>123456</ID>
   <INS>
      <INS_ID>34685</INS_ID>
      <SERIES></SERIES>
      <MAT>
         <MAT_ID>2233445566</MAT_ID>
         <C_TYPE>BCG</C_TYPE>
         <COL_TYPE></COL_TYPE>
         <MAT_RAT_GR>
            <RGC>STR</RGC>
            <MAT_RA>
               <TYPE>FC</TYPE>
               <RAT>GGG</RAT>
            </MAT_RA>
            <MAT_RA>
               <TYPE>FC2</TYPE>
               <RAT>GGG2</RAT>
            </MAT_RA>
         </MAT_RAT_GR>
         <IDENTIFIER NAME="ABCD" VALUE="GOR345"></IDENTIFIER>
         <IDENTIFIER NAME="EFGH" VALUE="QELH7876"></IDENTIFIER>
      </MAT>
   </INS>
</ISSUER>
<ISSUER>
   <ID>777888</ID>
   <INS>
      <INS_ID>444555</INS_ID>
      <SERIES></SERIES>
      <MAT>
         <MAT_ID>444555666</MAT_ID>
         <C_TYPE>BCD</C_TYPE>
         <COL_TYPE></COL_TYPE>
         <MAT_RAT_GR>
            <RGC>STR</RGC>
            <MAT_RA>
               <TYPE>FC3</TYPE>
               <RAT>GGG4</RAT>
            </MAT_RA>
         </MAT_RAT_GR>
         <IDENTIFIER NAME="ABCD" VALUE="GOR345"></IDENTIFIER>
         <IDENTIFIER NAME="EFGH" VALUE="QELH7876"></IDENTIFIER>
      </MAT>
   </INS>
</ISSUER>
</GISF>

预期产出:

ID           INS_ID       MAT_ID           TYPE       RAT

123456    ,   34685   ,    2233445566  ,      FC    ,     GGG
123456    ,   34685   ,    2233445566  ,      FC2    ,    GGG2
777888    ,   444555  ,    444555666   ,      FC3    ,    GGG4

我尝试下面的脚本,它给我输出csv格式的输出。但我真的认为有更好的方法可以实现这一点,因为我手动遍历不同的级别并且还对标记名称进行了硬编码。

import xml.etree.ElementTree as ET
tree = ET.parse("GISF.xml")
root = tree.getroot()
for ISSUER in root.findall('ISSUER'):
    Iss_id = ISSUER.find('ID').text   
    for INSTRUMENT in ISSUER.findall('INS'):
        ins_id = INSTRUMENT.find('INS_ID').text
            for MATURITY in INSTRUMENT.findall('MAT'):
            may_id = MATURITY.find('MAT_ID').text
            line = Iss_id+','+ins_id+','+may_id
            print (line)

生成输出:

    123456,34685,2233445566
    777888,444555,444555666

1 个答案:

答案 0 :(得分:0)

https://pypi.python.org/pypi/xmlutils

这是一个很好的起点。