我目前正在尝试将逻辑应用于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字符并删除
。