1

情報を xml 形式で配信する専用サーバーから機器データを読み取っています。私が書いたコードは次のとおりです: from lxml import etree as 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

すっごく、何も出てこない。xpath 呼び出しの/value代わりにを使用してみましたが、結果は変わりません。/text()私の問題ですか:

1) for ループの xpath コマンドが間違っていますか? また

2) リスト変数を構造化した方法に問題がありますdmtValか? また

3)私が完全に見逃しているものは他にありますか?

どんな提案でも大歓迎です!前もって感謝します...

4

3 に答える 3

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
于 2012-08-15T00:24:37.853 に答える
0

タグを数え<dmt/>てからインデックスごとに繰り返し処理することは、非効率的で非 Python 的です。それとは別に、配列のインデックス付けに間違った構文 (インデックスではなくスライス) を使用しています。実際、インデックスを作成する必要はまったくありませんval。これを行うには、Python の方法でリスト内包表記を使用します。

これは、ストラナックが提案したもののわずかに変更されたバージョンです。

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)
于 2012-08-15T09:43:10.550 に答える
0

これを説明できますか:

dmtVal[i:0]

反復がカウントで始まり、0時間の経過とともに増加する場合、実際にはリストに何も格納していません。

于 2012-08-15T00:25:12.180 に答える