【问题标题】:Duplicate values in list when parsing xml?解析xml时列表中的重复值?
【发布时间】:2013-05-20 14:18:00
【问题描述】:

我有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

当打印出我收到的列表时:

 ['\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']

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

【问题讨论】:

    标签: python xml-parsing elementtree


    【解决方案1】:

    您有重复项,因为您在开始事件和结束事件上都追加了两次。

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

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

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

    for event, elem in context:
        if event == 'end':
            outList.append(elem.text)
    

    【讨论】:

      【解决方案2】:

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

      context = iter(context)
      

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

      【讨论】:

        猜你喜欢
        • 2020-06-03
        • 2021-02-28
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        相关资源
        最近更新 更多