使用从lxmlxpath命令获得的数据填充Python列表

使用从lxmlxpath命令获得的数据填充Python列表,python,xpath,lxml,Python,Xpath,Lxml,我正在从一个以xml格式提供信息的专业服务器读取仪器数据。我写的代码是: 从lxml导入etree作为ET 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(dmt

我正在从一个以xml格式提供信息的专业服务器读取仪器数据。我写的代码是: 从lxml导入etree作为ET

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
$python XMLparse2.py
0x24
0x21
0x01
0
0
0
0
0x00
0x00
0x32
0x01
0
0
0
0
0x00
0x00
…开始解析XML节点
2.
[]
…完成
苏欧,什么都没出来。我尝试在xpath调用中使用
/value
代替
/text()
,但结果没有改变。我的问题是:

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

2) 我构造列表变量
dmtVal
的方式有问题吗?或

3) 还有什么我完全错过了


我欢迎任何建议!提前感谢…

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

在python中,通常不循环列表的索引,而是循环列表的元素。
那么,你会使用

for element in some_list:
而不是

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

处理XPath的方式也是错误的。

类似的方法应该可以工作(未经测试):


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

在python中,通常不循环列表的索引,而是循环列表的元素。
那么,你会使用

for element in some_list:
而不是

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

处理XPath的方式也是错误的。

类似的方法应该可以工作(未经测试):

你能解释一下吗:

dmtVal[i:0]
如果迭代开始时的计数为
0
,并且随着时间的推移而递增,那么实际上列表中没有存储任何内容。

您能解释一下吗:

dmtVal[i:0]
如果迭代开始时计数为
0
并随时间递增,则实际上列表中没有存储任何内容。

计数
标记,然后按索引对其进行迭代既低效又不符合Python。除此之外,您对索引数组使用了错误的语法(切片而不是索引)。事实上,您根本不需要为
val
编制索引,而是使用列表理解的python方法

以下是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)
计数
标记,然后通过索引对它们进行迭代,这既低效又不符合Pythonic。除此之外,您对索引数组使用了错误的语法(切片而不是索引)。事实上,您根本不需要为
val
编制索引,而是使用列表理解的python方法

以下是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)

嗨,stranac,是的,我想我可能在这两个方面都弄错了,因为我是XML和Python的高手。。。但是这个项目需要我同时学习这两个方面!正如你所指出的,这很有趣,但并非没有挑战。我会尽快尝试这个改变,不过我现在得去开会了。效果很好,斯特拉克——谢谢!嗨,stranac,是的,我想我可能在这两个方面都弄错了,因为我是XML和Python的高手。。。但是这个项目需要我同时学习这两个方面!正如你所指出的,这很有趣,但并非没有挑战。我会尽快尝试这个改变,不过我现在得去开会了。效果很好,斯特拉克——谢谢!嗨,伊霍尔,谢谢你。我是一个相对的疯子,所以有些事情我不知道。我将详细研究它,既作为一种学习经验,也因为它可能为我将来需要从类似的xml文件中提取的其他项目提供了一种前进的道路。我对列出理解是新手,因此需要一些时间来理解这一点。我已经看得更详细了,这是非常光滑的。再次感谢Ihor。列表理解和生成器是Python的强大功能。我建议你看两段视频,它们来自:about和。我刚刚查看了这些链接——看起来信息棒极了——我就像一套便宜的西装一样。非常感谢这些链接。我以前听说过udacity,但从未看过。我就像糖果店里的孩子!嗨,伊霍尔,谢谢你。我是一个相对的疯子,所以有些事情我不知道。我将详细研究它,既作为一种学习经验,也因为它可能为我将来需要从类似的xml文件中提取的其他项目提供了一种前进的道路。我对列出理解是新手,因此需要一些时间来理解这一点。我已经看得更详细了,这是非常光滑的。再次感谢Ihor。列表理解和生成器是Python的强大功能。我建议你看两段视频,它们来自:about和。我刚刚查看了这些链接——看起来信息棒极了——我就像一套便宜的西装一样。非常感谢这些链接。我以前听说过udacity,但从未看过。我就像糖果店里的孩子!