如何使用python解析xml并转换为csv

flseospp  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(488)

我对python编程相当陌生。我们最近参与了一个项目,我需要将xml文档转换成文本或csv格式,这样我们就可以将其加载到hadoop中,并通过impala将其呈现给用户。下面是一个示例xml,我正在寻找如下所示的输出格式。我不想直接寻求帮助,但因为这对我来说是全新的,所以我要向你们这些Maven求助。
示例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
b5buobof

b5buobof1#

https://pypi.python.org/pypi/xmlutils
这是一个好的开始。

相关问题