Edición de valores en un archivo xml con Python

Oye. Quiero tener un archivo config.xml para la configuración en una aplicación web de Python.

Hice car.xml manualmente. Se parece a esto:

  off   

Ahora quiero ver si las luces intermitentes están activadas o desactivadas, usando xml.etree.ElementTree .

 import xml.etree.ElementTree as ET tree = ET.parse('car.xml') blinkers = tree.findtext('lights/blinkers') print blinkers > off 

Ahora quiero activar y desactivar las luces intermitentes, ¿cómo puedo hacer esto?

XML es una forma bastante pobre de almacenar los ajustes de configuración. Por un lado, XML no es exactamente amigable para los humanos en el contexto de la configuración. En el universo de Python en particular, es mejor utilizar un módulo de configuración (como comentó @AaronMcSmooth). Desafortunadamente, muchos proyectos en el mundo de Java han utilizado (mal) XML para la configuración, lo que lo convierte en una tendencia. Yo diría que esta tendencia realmente apesta. Usa configuraciones nativas (módulo en Python) o algo más fácil de usar como YAML.

Puede eliminar nodos llamando al método de remove del nodo principal e insertar nodos llamando a ET.SubElement:

 import xml.etree.ElementTree as ET def flip_lights(tree): lights = tree.find('lights') state=get_blinker(tree) blinkers = tree.find('lights/blinkers') lights.remove(blinkers) new_blinkers = ET.SubElement(lights, "blinkers") new_blinkers.text='on' if state=='off' else 'off' def get_blinker(tree): blinkers = tree.find('lights/blinkers') return blinkers.text tree = ET.parse('car.xml') print(get_blinker(tree)) # off flip_lights(tree) print(get_blinker(tree)) # on flip_lights(tree) print(get_blinker(tree)) # off flip_lights(tree) print(get_blinker(tree)) # on tree.write('car2.xml') 

Sin abordar los méritos de usar XML en lugar de un módulo de Python para administrar archivos de configuración, aquí se explica cómo hacer lo que pidió usando lxml :

 >>> from lxml import etree >>> xml = """  on  """ >>> doc = etree.fromstring(xml) >>> elm = doc.xpath("/car/lights/blinkers")[0] >>> elm.text="off" >>> etree.tostring(doc) '\n \n off\n \n' 

Echa un vistazo a este artículo .

Pero considere el comentario anterior de AaronMcSmooth: este puede ser el enfoque equivocado para su problema general.

Utilice hermosas piedras Aquí está la sección sobre la modificación de XML:

http://www.crummy.com/software/BeautifulSoup/documentation.html#Modifying%20the%20Parse%20Tree