我有以这种格式的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代码中使用它。有任何想法吗?谢谢!
答案 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)