我有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
当打印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']
为什么我在列表中收到重复值? 如何解决?
答案 0 :(得分:2)
你有重复项,因为你要在开始事件和结束事件上追加两次。
只侦听一种事件类型或另一种事件类型,或在迭代时检查事件类型。做前者是一个单行改变:
context = ET.iterparse('temp.xml', events=('end',))
...或者,如果您因其他原因想要收听这两种事件类型:
for event, elem in context:
if event == 'end':
outList.append(elem.text)
答案 1 :(得分:0)
因为同一个标签发生了开始和结束事件。此外,这样做有什么意义:
context = iter(context)
context已经是一个迭代器,因为iterparse()返回一个迭代器。