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

Python-将XML元素和子属性转换为CSV,python,xml,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 Timestam

我有以下格式的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>
我可以使用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代码中。有什么想法吗?谢谢

我认为
lxml
库中的
objectify
模块是一个不错的选择

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]

我认为
lxml
库中的
objectify
模块是一个不错的选择

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]

使用XSLT:)这就是它的用途(如果您愿意,可以使用python)使用XSLT:)这就是它的用途(如果您愿意,可以使用python)嗨,谢谢您的帮助。我尝试运行您的代码,但出现错误
未定义名称“sd”
。知道那是什么吗?一个额外的括号。刚刚更正了代码,请立即重试。这次我发现错误
未定义名称“sl”
。我将第一个
for
更改为
for sl in mo.Slot
,然后得到消息
没有这样的子项:Slot
我让它工作了。我必须切换for语句的顺序:
for sd in mo.Slot_data for sl in sd.Slot
。谢谢真奇怪。我将再次测试它,并相应地更改答案。很高兴听到你成功了,谢谢你的帮助。我尝试运行您的代码,但出现错误
未定义名称“sd”
。知道那是什么吗?一个额外的括号。刚刚更正了代码,请立即重试。这次我发现错误
未定义名称“sl”
。我将第一个
for
更改为
for sl in mo.Slot
,然后得到消息
没有这样的子项:Slot
我让它工作了。我必须切换for语句的顺序:
for sd in mo.Slot_data for sl in sd.Slot
。谢谢真奇怪。我将再次测试它,并相应地更改答案。很高兴听到你成功了
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)