Python - 将XML元素和子属性转换为CSV

时间:2018-04-18 18:47:33

标签: python xml

我有以这种格式的XML数据:

<Slot_Data Timestamp="08-18-2017 07:03:20.890">
    <Slot Id="1" Count="23" Error="4" />
    <Slot Id="2" Count="31" Error="0" />
    <Slot Id="3" Count="27" Error="2" />
</Slot_Data>
<Slot_Data Timestamp="08-18-2017 07:55:54.574">
    <Slot Id="1" Count="21" Error="0" />
    <Slot Id="2" Count="23" Error="3" />
    <Slot Id="3" Count="34" Error="1" />
</Slot_Data>

我试图以这种格式排列并输出到CSV:

Timestamp           Slot    Count   Error
08/18/17 07:03:21   1       23      4
08/18/17 07:03:21   2       31      0
08/18/17 07:03:21   3       27      2
08/18/17 07:55:55   1       21      0
08/18/17 07:55:55   2       23      3
08/18/17 07:55:55   3       34      1

我可以使用etree:

将子属性转换为上面的CSV格式(减去时间戳)
tree = ET.parse(xml_file)
root = tree.getroot()

for line in root.iter('Slot'):
    row = []
    id = line.get('Id')
    row.append(id)
    count = line.get('Count')
    row.append(count)
    error = line.get('Error')
    row.append(error)
    csvwriter.writerow(row)

但我无法弄清楚如何附加元素的时间戳。我可以使用etree轻松打印它们,但我不确定如何在上面的Python代码中使用它。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我认为来自objectify库的lxml模块是可行的方法。

from lxml import objectify

s = '''<document><Slot_Data Timestamp="08-18-2017 07:03:20.890">
    <Slot Id="1" Count="23" Error="4" />
    <Slot Id="2" Count="31" Error="0" />
    <Slot Id="3" Count="27" Error="2" />
</Slot_Data>
<Slot_Data Timestamp="08-18-2017 07:55:54.574">
    <Slot Id="1" Count="21" Error="0" />
    <Slot Id="2" Count="23" Error="3" />
    <Slot Id="3" Count="34" Error="1" />
</Slot_Data></document>'''

mo = objectify.fromstring(s)
lines_data = [ (sd.get('Timestamp'), sl.get('Id'), sl.get('Count'), sl.get('Error'))
                  for sd in mo.Slot_Data                    
                       for sl in sd.Slot]

注意我必须添加document标记才能解析字符串(需要根节点)。

现在lines_data包含元组列表中所需的所有数据,您可以使用csv库编写数据或自行格式化。例如:

with open('myfile.csv', 'w') as f:
    file_contents = '\n'.join( '%s,%s,%s,%s'%l for l in lines_data )
    f.write(file_contents)