将属性添加到子元素

时间:2016-05-06 02:27:17

标签: python xml python-3.x elementtree

我正在尝试将属性添加到当前目录中所有XML文件中的所有子元素。此属性应等于每个字符串的长度。例如,XML看起来像这样:

<?xml version="1.0" encoding="utf-8?>
    <RootElement>
        <String Id="PythonLove">I love Python.</String>
    </RootElement>

所以,如果它按照它应该的方式工作,它会让孩子打开标签看起来像这样:

<String Id="PythonLove" length="14">

我阅读了很多论坛,并且都指向.set或.attrib,以将属性添加到现有XML中。但这些都不会对文件产生任何影响。我的脚本目前看起来像这样:

for child in root:
    length_limit = len(child.text)
    child.set('length', length_limit)

我也试过child.attrib['length'] = length_limit。这也行不通。我做错了什么?

由于

2 个答案:

答案 0 :(得分:0)

您需要在设置之前将值转换为字符串。

>>> xml = '''<?xml version="1.0" encoding="utf-8"?>
... <RootElement>
...     <String Id="PythonLove">I love Python.</String>
... </RootElement>
... '''
>>> import xml.etree.ElementTree as ET
>>> root = ET.fromstring(xml)
>>> for child in root:
...     child.set('length', str(len(child.text)))  # <---
... 
>>> print(ET.tostring(root).decode())
<RootElement>
    <String Id="PythonLove" length="14">I love Python.</String>
</RootElement>

答案 1 :(得分:0)

知道了!非常高兴,因为这是几个星期的挣扎。我最后写的只是'infile'(用于迭代cwd中的文件)并且它可以覆盖现有的XML(必须首先注册命名空间,这是我遇到的另一个小驼峰)。完整代码:

import fileinput
import os, glob
import xml.etree.ElementTree as ET

path = os.getcwd()

for infile in glob.glob(os.path.join(path, '*.xml')): 
    try:
        tree = ET.parse(infile)
        root = tree.getroot() # sets variable 'root' to the root element

        for child in root:
            string_length = str(len(child.text)) 
            child.set('length', length_limit)

    ET.register_namespace('',"http://schemas.microsoft.com/wix/2006/XML")   
    tree.write(infile)