如何使用 ElementTree for Python 循环访问所有 XML 元素并将逻辑应用于每个元素的值



我目前正在尝试将逻辑应用于XML文件中的元素值。具体来说,我试图将所有值编码为UTF-8,同时不触及任何元素名称/属性本身。

下面是示例XML:

<?xml version="1.0"?>
<sd_1>
    <sd_2>
        <sd_3>311 is a fancy kind of E</sd_3>
    </sd_2>
</sd_1>

目前我已经尝试了3种方法来实现这一点,但没有成功:

首先,我尝试遍历每个元素,使用。text检索值,并使用。parse:

import xml.etree.ElementTree as ET
et = ET.parse('xml/test.xml')
for child in et.getroot():
    for core in child:
        core_value = str(core.text)
        core.text = core_value.encode('utf-8')
et.write('output.xml')

这将导致XML文件中没有正确更改文本311,它只是保持原样。

接下来,我尝试了。iterparse与cElementTree无效:

import xml.etree.cElementTree as etree
xml_file_path = 'xml/test.xml'
with open(xml_file_path) as xml_file:
    tree = etree.iterparse(xml_file) 
    for items in tree:
        for item in items:
            print item.text
etree.write('output1.xml')

结果是:

 "...print item.textn', "AttributeError: 'str' object has no attribute 'text'..."

不确定我在那里做错了什么,我已经看到了多个具有相同排列的示例,但是当我在没有。text的情况下打印元素时,我看到元组在开始时具有'end'的字符串值,我认为这导致了这个方法的问题。

我如何正确地遍历我的元素,而不指定元素名称,例如。findall(),应用逻辑到每个元素的值,以便当我写xml文件时,它保存了程序迭代元素值时所做的更改?

这是你要找的吗?

import xml.etree.ElementTree as ET
et = ET.parse('xml/test.xml')
for child in et.getroot():
    for core in child:
        core_value = str(core.text)
        core.text = core_value.decode('unicode-escape')
et.write('output.xml')

这是个有趣的问题。让我们把重点放在你提出的第一种方法上,因为这应该是解决这个问题的一种完全好的方法。当我将这些行逐一打印出来时,得到的结果如下:

>>> core_value
'\311 is a fancy kind of E'

发生在我身上的事情是,字符被读取为文字'',必须转义才能打印出来。如果我们将转义字符(\)更改为非转义字符(),我们将得到以下内容:

>>> cv = core_value.replace('\311','311')
'xc9 is a fancy kind of E'
>>> print cv
É is a fancy kind of E

奇怪的是,你不知道在原始文件中311是"应该是"一个字符还是四个字符。如果你知道这些字符都是一个字符,你可以根据这个答案编写一些糟糕的代码:

Python Unicode,在正常字符串中有Unicode编号,想要打印Unicode

之后的所有内容转换为正确的unicode字符并删除

最新更新