2012-08-15 92 views
1

我正在从以xml格式提供信息的专业服务器读取仪器数据。我写的代码是: 从LXML进口etree作为ET使用从lxml xpath命令获取的数据填充Python列表

xmlDoc = ET.parse('http://192.168.1.198/Bench_read.xml') 
print ET.tostring(xmlDoc, pretty_print=True) 

dmtCount = xmlDoc.xpath('//dmt') 
print(len(dmtCount)) 

dmtVal = [] 

for i in range(1, len(dmtCount)): 
    dmtVal[i:0] = xmlDoc.xpath('./address/text()') 
    dmtVal[i:1] = xmlDoc.xpath('./status/text()') 
    dmtVal[i:2] = xmlDoc.xpath('./flow/text()') 
    dmtVal[i:3] = xmlDoc.xpath('./dp/text()') 
    dmtVal[i:4] = xmlDoc.xpath('./inPressure/text()') 
    dmtVal[i:5] = xmlDoc.xpath('./actVal/text()') 
    dmtVal[i:6] = xmlDoc.xpath('./temp/text()') 
    dmtVal[i:7] = xmlDoc.xpath('./valveOnPercent/text()') 

print dmtVal 

而且我得到的结果是:

$python XMLparse2.py 
<response> 

<heartbeat>0x24</heartbeat> 

<dmt node="1"> 

    <address>0x21</address> 
    <status>0x01</status> 
    <flow>0.000000</flow> 
    <dp>0.000000</dp> 
    <inPressure>0.000000</inPressure> 
    <actVal>0.000000</actVal> 
    <temp>0x00</temp> 
    <valveOnPercent>0x00</valveOnPercent> 

</dmt> 

<dmt node="2"> 

    <address>0x32</address> 
    <status>0x01</status> 
    <flow>0.000000</flow> 
    <dp>0.000000</dp> 
    <inPressure>0.000000</inPressure> 
    <actVal>0.000000</actVal> 
    <temp>0x00</temp> 
    <valveOnPercent>0x00</valveOnPercent> 

</dmt> 

</response> 

...Starting to parse XML nodes 
2 
[] 
...Done 

的sooo,无所不出来。我试过在xpath调用中使用/value来代替/text(),但结果没有改变。是我的问题:

1)for循环中的xpath命令不正确?或

2)我的结构列表变量dmtVal的方式存在问题?或

3)还有什么我完全失踪?

我欢迎任何建议!在此先感谢...

回答

0

计数<dmt/>标记,然后通过索引对它们进行迭代既是低效的,也是非pythonic。除此之外,您正在使用错误的语法(切片而不是索引)来索引数组。实际上你根本不需要索引val,这样做Pythonic方式使用列表解析。

这里有什么建议stranac略加修改:

from lxml import etree as ET 

xmlDoc = ET.parse('http://192.168.1.198/Bench_read.xml') 
print ET.tostring(xmlDoc, pretty_print=True) 

response = xmlDoc.getroot() 

tags = (
    'address', 
    'status', 
    'flow', 
    'dp', 
    'inPressure', 
    'actVal', 
    'temp', 
    'valveOnPercent', 
) 

dmtVal = [] 

for dmt in response.iter('dmt'): 
    val = [dmt.xpath('./%s/text()' % tag) for tag in tags] 
    dmtVal.append(val) 
+0

嗨伊霍尔,谢谢你。我是一个相对的小白菜,所以有些这是在我的头上。我将详细研究它,这既是一次学习体验,也是因为它可能为我将来需要从类似的xml文件中提取出来的其他项目提供一种方法。 – 2012-08-15 16:18:14

+0

我是新来的列表理解,所以需要一些时间来理解这一点。我更详细地看过它,而且这很光滑。再次感谢伊霍尔。 – 2012-08-15 18:41:24

+0

列表解析和生成器是Python的强大功能。我建议你看看[Udacity CS212课程](http://www.udacity.com/view#Course/cs212/CourseRev/apr2012)上的两个视频:关于[列表解析](http:// www .youtube.com/watch?v = MvXxpU3wcLc)和[生成器表达式](http://www.youtube.com/watch?v=qZVWbkE-Fg0)。 – 2012-08-15 22:17:36

1

dmtVal[i:0]是切片的语法。
您可能想索引:dmtVal[i][0]。但这也行不通。

您通常不会遍历Python中列表的索引,而是循环遍历它的元素。
所以,你会使用

for element in some_list: 

而不是

for i in xrange(len(some_list)): 
    element = some_list[i] 


怎样对待自己的XPath的方式也是错误的。

像这样的东西应该工作(未测试):

from lxml import etree as ET 

xml_doc = ET.parse('http://192.168.1.198/Bench_read.xml') 
dmts = xml_doc.xpath('//dmt') 

dmt_val = [] 
for dmt in dmts: 
    values = [] 
    values.append(dmt.xpath('./address/text()')) 
    # do this for all values 
    # making this a loop would be a good idea 
    dmt_val.append(values) 

print dmt_val 
+0

stranac你好,是的,我想我很可能得到两方面错误的,因为我在XML和Python这样的菜鸟......但这个项目需要我同时学习!正如你所指出的那样,这很有趣,但并非没有挑战。我会尽快尝试这种改变,尽管我现在不得不离开去开会。 – 2012-08-15 02:03:15

+0

很好,stranac - 谢谢! – 2012-08-15 05:43:55

0

你能解释这一点:如果迭代与0计数开始,增量在次

dmtVal[i:0] 

,你实际上并没有在列表中存储任何内容。

相关问题