在列表中打印 'element1' 返回 <Element 'element1' at 0x0000013C6D4B9270>

Print 'element1' in list returms an <Element 'element1' at 0x0000013C6D4B9270>

我最近开始学习 python,我的代码有问题。 我正在尝试使用具有以下形式的 elementtree 解析 xml:

<UNHEATED_ROWS>6</UNHEATED_ROWS>
    <UNHEATED1 rid="1">
    </UNHEATED1>
    <UNHEATED2 rid="1">
    </UNHEATED2>
    <UNHEATED3 rid="1">
    </UNHEATED3>
    <UNHEATED4 rid="1">
    </UNHEATED4>
    <UNHEATED5 rid="1">
    </UNHEATED5>
    <UNHEATED6 rid="1">

有了这个:

for i in range root.iter('UNHEATED_ROWS'):
   uheatedzones = UNHEATED_ROWS.text
for j in range uheatedzones:
   uzones.append("UNHEATED" + str(j+1)):
for k in range(int(uheatedzones)):
   for uzones[k] in root.iter("UNHEATED%s" % (k+1)):
       print(uzones[k])

而不是 UNHEATED1,UNHEATED2... 我希望打印出来的是我得到的 <0x0000017263D28220 处的元素 'UNHEATED1'>

我的代码有什么问题? 谢谢

要获取 单个 元素的文本,请不要使用任何循环。 而是使用:

root.findtext('UNHEATED_ROWS')

但是请注意,returned 值是 字符串,而不是整数。

您代码中的另一个缺陷是 str(j+1)

第一个错误是jElement的对象class 并且它转换为字符串不会 return 它的文本。

第二个错误是 j+1,即您试图将 1 添加到此对象。

要正确处理每个 UNHEATED… 元素,您可以例如使用 root.iter() (不带参数)并在循环中检查标签名称是否以 "UNHEATED" 然后它包含一个数字(省略 UNHEATED_ROWS 元素)。 您必须导入 re 模块。

如果你想访问一个元素的attributes,使用attrib方法 一个元素,它 return 是一个字典 ({attr_name: attr_value}).

所以示例循环可以是:

i = 0
for it in root.iter():
    if re.match(r'UNHEATED\d', it.tag):
        i += 1
        print(f'{i}: {it.tag}: {it.attrib["rid"]}')

对于你的来源 XML 它打印:

1: UNHEATED1: 1
2: UNHEATED2: 1
3: UNHEATED3: 1
4: UNHEATED4: 1
5: UNHEATED5: 1
6: UNHEATED6: 1

另请注意,我没有在上面的循环中使用 it.text,因为每个 UNHEATED… 元素没有文本,在这种情况下 text 方法 returns None.

感谢您的回答。

<UNHEATED1 rid="1">
            <un_parameter1>82.8</un_parameter1>
            <un_parameter2>123.3720</un_parameter2>
            <ENVELOPE rid="1">
                <opaque_rows>17</opaque_rows>
                
                <transparent_column5>0.600,2.200,0.600,</transparent_column5>
                <transparent_column6>Α1,Α2,Α10,</transparent_column6>
                >
            </ENVELOPE>
</UNHEATED1>

每个 UNHEATED 都有相似的结构,我想访问所有 UNHEATED,这就是我使用循环的原因