2013-05-12 59 views
0

我正在尝试更改xml文档中的许多值。我尝试了几个不同的东西,但他们似乎没有改变任何东西,但他们确实似乎访问该文件,因为修改时间发生了变化,但该值并不是。更改xml文件中的值

from xml.etree import ElementTree as et 
import os 
import xml 

path = os.path.expanduser(r'~\AppData\Roaming\etc\etc\somefile.xml') 
et = et.parse(path) 

for name in et.findall('name'): 
    if name == 'sometext1': 
     name.text = "sometext2" 
et.write(path) 

其次试过,但我得到一个AttributeError的:“海峡”对象有没有属性“文本”

with open(path,'r+') as f: 
tree = et.parse(f) 

for node in tree.iter('favourite'): 
name = node.attrib.get('name') 

if name == 'sometext1': 
    name.text = "sometext2" 
tree.write(path) 

谁能劝哪里伊夫出了错

+0

'name'是元素的名称。 'node'是元素。 – Blender 2013-05-12 23:46:36

回答

0
  • 线

    et = et.parse(path) 
    

    使用et作为右侧模块和作为 左侧的变量名称。在此之后,不可能(或者至少非常难) 访问ElementTree模块。所以消除歧义et。例如,假设 ET是模块,并且treeElementTree

  • 在for循环中,name是一个元素,因此将name与 字符串进行比较将始终为False。而是使用

    name.text == 'sometext1' 
    

from xml.etree import ElementTree as ET 
import os 

path = os.path.expanduser(r'~\AppData\Roaming\etc\etc\somefile.xml') 
tree = ET.parse(path) 

for name in tree.findall('name'): 
    if name.text == 'sometext1': 
     name.text = "sometext2" 
     print(name) # for debugging only 
tree.write(path) 
+0

我已经尝试了这些更改,但仍然没有发生xml文件的更改。 – Syborg 2013-05-13 07:03:19

+0

你确定'tree.findall('name')'是查找元素吗?尝试在循环中放入一个'print'语句,以便查看是否找到元素。 (可能找不到''元素的原因之一是因为您可能需要在[namespace](http://en.wikipedia.org/wiki/XML_namespace)中引用它。) – unutbu 2013-05-13 10:42:47