编辑目录中的XML文件

时间:2019-01-15 14:57:06

标签: python xml

我正在尝试使用python脚本在文件夹的不同目录中编辑多个config.xml文件。我正在寻找一个特定的标签值,然后将其更改为新值。

我已经创建了一个数组,并且正在使用ElementTree api。

import os
import xml.etree.ElementTree as ET

d1 = r'/home/user/temp/a/'
d2 = r'/home/user/temp/b/'
d3 = r'/home/user/temp/c/' 
d4 = r'/home/user/temp/d/'
d5 = r'/home/user/temp/f/'

data = [d1, d2, d3, d4, d5]

for dir in data:

    tree = ET.ElementTree(os.path.join(dir + 'config.xml'))
    root = tree.getroot()

    for Element in tree.iter(tag='url'):
        print(Element.text)
        Element.text = str("new value")
        tree.write('config.xml')

这是要修改的xml

 <?xml version='1.0' encoding='UTF-8'?>
  <scm class="hudson.plugins.git.GitSCM" plugin="git@2.4.2">
    <configVersion>2</configVersion>
     <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <url>happy changes</url>
       </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
     <branches>
       <hudson.plugins.git.BranchSpec>
         <name>refactor</name>
     </hudson.plugins.git.BranchSpec>
    </branches>
<doGenerateSubmoduleConfigurations>false
</doGenerateSubmoduleConfigurations>
    <submoduleCfg class="list"/>
    <extensions>
      <hudson.plugins.git.extensions.impl.PerBuildTag/>
    </extensions>
  </scm>

这是错误消息

for Element in tree.iter(tag='url'):
  File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 620, in 
  iter
  return self._root.iter(tag)
 AttributeError: 'str' object has no attribute 'iter'

2 个答案:

答案 0 :(得分:0)

您是否忘记在.write()调用中提供完整的路径名?像这样:

tree.write(os.path.join(dir + 'config.xml'))

否则,所有config.xml文件都将被简单地写入当前工作目录。

答案 1 :(得分:0)

ElementTree需要一个Element对象作为参数,而不是带有XML源代码的文件名。您需要使用ElementTree API的parse()函数来解析文件。

您需要完整的路径+文件名来写入结果文件,并实际使用os.path.join()来连接路径和文件名。

#!/usr/bin/env python3
import os
import xml.etree.ElementTree as ET


def main():
    path_names = [
        '/home/user/temp/a',
        '/home/user/temp/b',
        '/home/user/temp/c',
        '/home/user/temp/d',
        '/home/user/temp/e',
    ]
    for path in path_names:
        filename = os.path.join(path, 'config.xml')
        tree = ET.parse(filename)
        for element in tree.iter('url'):
            print(element.text)
            element.text = 'new value'
        tree.write(filename)


if __name__ == '__main__':
    main()