2013-03-27 61 views
0

我目前正在尝试将逻辑应用于XML文件中的元素值。具体而言,我试图将所有值编码为UTF-8,同时本身并未触及任何元素名称/属性。如何遍历所有XML元素并将逻辑应用于ElementTree for Python的每个元素的值

下面是示例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(),将逻辑应用于每个Element中的值,以便在我将xml写入文件时保存程序迭代元素值时所做的更改?

回答

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') 
+1

哇,我不知道这存在!很有帮助!什么是对我的明显低劣的答案在计算器上做'正确'的事情? – alexplanation 2013-03-27 20:21:49

+0

@Square,如果在初始文档中字符实际上是正确编码的,那么您是否只需要打开它就可以将它们显示为unicode字符? – alexplanation 2013-03-27 20:26:40

+0

我很抱歉,这确实是我在找的东西。这对我来说是一个陌生的话题,当我将它加载到PlanetPress时,它正确地出来了。谢谢你的正确答案gauden,并感谢你的帮助以及alex。 – BagoDev 2013-03-27 20:34:54

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, have unicode number in normal string, want to print unicode

要transorm所有的\到正确的Unicode字符之后到来的东西并删除\

相关问题