0

我有xml:

<?xml version="1.0" encoding="UTF-8"?>
<rows>
  <row>
    <ro new="TEMP_1">TEMP_11</ro>
    <ro new="TEMP_2">TEMP_12</ro>
   <ro new="TEMP_3">TEMP_13</ro>
  </row>
 <row>
    <ro new="TEMP_1">TEMP_14</ro>
    <ro new="TEMP_2">TEMP_15</ro>
    <ro new="TEMP_3">TEMP_16</ro>
  </row>
 </rows>

和解析器:

import xml.etree.cElementTree as ET

context = ET.iterparse('temp.xml', events=("start", "end"))
context = iter(context)

outList = []
for event,elem in context:
    tag = elem.tag
    value = elem.text
    outList.append(value)
print outList

当 print outList 我收到:

 ['\n', '\n', 'TEMP_11', 'TEMP_11', 'TEMP_12', 'TEMP_12', 'TEMP_13', 'TEMP_13', '\n', '\n', 'TEMP_14', 'TEMP_14', 'TEMP_15', 'TEMP_15', 'TEMP_16', 'TEMP_16', '\n', '\n']

为什么我在列表中收到重复值?如何解决?

4

2 回答 2

2

您有重复项,因为您要附加两次——在开始事件和结束事件上。

要么只监听一种事件类型或另一种,要么在迭代时检查事件类型。做前者是一行更改:

context = ET.iterparse('temp.xml', events=('end',))

...或者,如果您出于其他原因想同时收听这两种事件类型:

for event, elem in context:
    if event == 'end':
        outList.append(elem.text)
于 2013-05-20T14:22:11.727 回答
0

因为开始和结束事件发生在同一个标​​签上。另外,这样做有什么意义:

context = iter(context)

context 已经是一个迭代器,因为 iterparse() 返回一个迭代器。

于 2013-05-20T14:24:47.930 回答