0

我目前正在尝试将逻辑应用于 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,它只是保持原样。

接下来我用 cElementTree 尝试了 .iterparse 无济于事:

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.text\n', "AttributeError: 'str' object has no attribute 'text'..."

不知道我在那里做错了什么,我已经看到了多个具有相同排列的示例,但是当我通过没有 .text 的元素打印时,我看到开头字符串值为“end”的元组,我认为那是导致此方法出现问题。

如何正确迭代我的元素,并且不指定元素名称,例如 .findall(),将逻辑应用于每个元素中包含的值,以便当我将 xml 写入文件时,它会保存程序迭代时所做的更改元素值?

4

2 回答 2

4

这是你想要的?

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')
于 2013-03-27T20:03:38.470 回答
0

这是个有趣的问题。让我们关注您提出的第一种方法,因为这应该是解决此问题的完全好方法。当我一一打印出这些行时,这是我得到的:

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

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

于 2013-03-27T20:20:30.540 回答