我正在尝试将xml文件解析为csv,但运气不佳。这是我第一次学习Python。
这是xml结构的示例:
<!-- /StationName/BACnetTemp/MNB_1_HX/HiPressureAlarm -->
<node name="HiPressureAlarm" class="tridium.control.BinaryInputNode" module="coreRuntime" release="2.301.535.v1">
<properties>
<position><x>576</x><y>866</y></position>
<timeDelay>
<duration>60</duration>
</timeDelay>
<eventEnable>
<toOffnormal>true</toOffnormal>
<toFault>false</toFault>
<toNormal>true</toNormal>
</eventEnable>
<alarmText>MCD Basement Re-Heat High Pressure Alarm</alarmText>
<changeOfStateTime>2018-05-07T08:55:04.09-4</changeOfStateTime>
<changeOfStateCount>848</changeOfStateCount>
<elapsedActiveTime>
<duration>126872</duration>
</elapsedActiveTime>
<activeInactiveText>
<active>Alarm</active>
<inactive>Normal</inactive>
</activeInactiveText>
<alarmValueEnabled>true</alarmValueEnabled>
</properties>
</node> <!-- HiPressureAlarm -->
某些属性将不适用于所有节点,我希望这些属性为空白单元格。
这是我的代码的开头。我可以用它写CSV的标题行,但无法弄清楚如何很好地浏览xml。
import xml.etree.ElementTree as ET
import csv
tree = ET.parse("station.xml")
root = tree.getroot()
# open a file for writing
data = open('Alm_Log.csv', 'w')
# create the csv writer object
csvwriter = csv.writer(data)
csvwriter.writerow(["pointName", "pointPath", "timeDelay", "toOffnormal", "toFault", "toNormal", "alarmText", "highLimit", "lowLimit", "deadband", "lowLimitEnabled", "highLimitEnabled"])
pointName来自节点属性“名称”
pointPath来自节点前的注释
timeDelay必须是timeDelay下的duration属性
toOffnormal,toFault和toNormal都来自eventEnable属性
其余的值来自同名的属性(大小写和全部),再说一次,如果该节点不存在它们,我希望它们是空白单元格。
TYIA为您提供帮助。您可以提供任何有助于我理解的解释,也将不胜感激。
谢谢!