我正在尝试使用Python和ElementTree模块从weathergoose设备读取XML数据。我可以从“设备”节点获取“名称”数据,但我想读取“设备”节点下列出的数据。特别是,我想知道“TempF”的值
以下是XML数据的示例:
<server host="WeatherGoose" address="10.0.0.11" <omited stuff> tempunit="F">
<devices>
<device id="0114BE53110000E6" name="WeatherGoose" type="WxGoos" available="1" index="0">
<field key="TempC" value="20.55" niceName="Temperature (C)" min="-20" max="50" type="2"/>
<field key="TempF" value="68.99" niceName="Temperature (F)" min="-4" max="122" type="2"/>
<field key="Humidity" value="42.00" niceName="Relative Humidity" min="0" max="99" type="2"/>
<field key="Airflow" value="33.27" niceName="Air Flow" min="0" max="100" type="2"/>
<field key="Light" value="2.00" niceName="Light Level" min="1" max="99" type="2"/>
<field key="Sound" value="30.00" niceName="Sound Level" min="0" max="99" type="2"/>
<field key="IO1" value="99.00" niceName="Moisture" min="0" max="99" type="2"/>
<field key="IO2" value="99.00" niceName="IO-2" min="0" max="99" type="2"/>
<field key="IO3" value="0.00" niceName="Door Contacts" min="0" max="99" type="2"/>
</device>
</devices>
</server>
到目前为止,我掌握的情况如下:
import os
import urllib
import xml.etree.ElementTree as ET
def main():
feed = urllib.urlopen("http://10.0.0.11/data.xml")
try:
tree = ET.parse(feed)
root = tree.getroot()
event = root.find("devices")
for e in event:
print e.attrib['name']
except Exception, inst:
print "Error: %s: %s" % (tree, inst)
if __name__ == "__main__":
main()
这会产生设备的主机名,但我找不到挖掘“字段键”数据的魔力。任何帮助都将不胜感激。你知道吗
您应该能够通过使用xpath
field[@key='TempF']
(当前元素上下文为device
)来选择具有值为TempF
的field
属性的key
元素。你知道吗示例(将
feed
更改回urllib调用)。。。你知道吗这将打印:
注意:如果您有多个
device
元素,这将迭代每个元素。你知道吗下面的代码遍历xml并填充dict,其中键是设备id,值是dict列表。每个dict表示一个“field”属性。只收集定义为“有趣”的字段。你知道吗
输出
相关问题 更多 >
编程相关推荐