2015-10-07 1 views
0

Пример XML:добавления к значениям атрибутов из XML-с помощью Python

<response version-api="2.0"> 
    <value> 
    <books> 
     <book available="20" id="1" tags=""> 
      <title></title> 
      <author id="1" tags="Joel">Manuel De Cervantes</author> 
     </book> 
     <book available="14" id="2" tags="Jane"> 
      <title>Catcher in the Rye</title> 
      <author id="2" tags="">JD Salinger</author> 
     </book> 
     <book available="13" id="3" tags=""> 
      <title></title> 
      <author id="3">Lewis Carroll</author> 
     </book> 
     <book available="5" id="4" tags="Harry"> 
      <title>Don</title> 
      <author id="4">Manuel De Cervantes</author> 
     </book> 
    </books> 
    </value> 
</response> 

Я хочу, чтобы добавить строковое значение моего выбора для всех атрибутов, называемых «метки». Это означает, имеет ли атрибут «теги» значение или нет, а также атрибуты находятся на разных уровнях структуры xml. Я пробовал метод findall(), но я продолжаю получать сообщение об ошибке «IndexError: list index out the range». Это код, который я до сих пор что немного не хватает, но я выдыхаться за то, что еще мне нужно напечатать ...

splitter = etree.XMLParser(strip_cdata=False) 
xmldoc = etree.parse(os.path.join(root, xml_file), splitter).getroot() 
for child in xmldoc: 
    if child.tag != 'response': 
     allDescendants = list(etree.findall()) 
     for child in allDescendants: 
      if hasattr(child, 'tags'): 
       child.attribute["tags"].value = "someString" 

ответ

1

findall() является правильным API для использования. Вот пример:

from lxml import etree 
import os 

splitter = etree.XMLParser(strip_cdata=False) 
xml_file = 'foo.xml' 
root = '.' 
xmldoc = etree.parse(os.path.join(root, xml_file), splitter).getroot() 
for element in xmldoc.findall(".//*[@tags]"): 
    element.attrib["tags"] += " KILROY!" 

print etree.tostring(xmldoc) 
+0

спасибо, что это сработало! – CommittedEel