2016-05-06 2 views
2

Я пытаюсь добавить атрибут ко всем дочерним элементам во все файлы 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. Это также не работает. Что я делаю не так?

Thanks

ответ

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> 
+0

спасибо falsetru. хорошо, так что сейчас очень близко. Он корректно печатает в командной строке атрибут length. Однако он все равно не добавляет атрибут к самому XML. – coolhand2020

+0

@ coolhand2020, Вы имеете в виду ''? Затем посмотрите следующее: http://pastebin.com/s78aYw06 и сообщите мне, хотите ли вы этого. Спасибо за ваш отзыв. – falsetru

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) 
Смежные вопросы