2010-09-06 14 views
7

Soy nuevo en python/lxml Después de leer el sitio lxml y bucear en python no pude encontrar la solución a mis problemas n00b. Tengo la muestra XML siguiente:Python Lxml: anexe un xml existente con datos nuevos

--------------- 
<addressbook> 
    <person> 
     <name>Eric Idle</name> 
     <phone type='fix'>999-999-999</phone> 
     <phone type='mobile'>555-555-555</phone> 
     <address> 
      <street>12, spam road</street> 
      <city>London</city> 
      <zip>H4B 1X3</zip> 
     </address> 
    </person> 
</addressbook> 
------------------------------- 

Estoy tratando de anexar un niño al elemento raíz y escribir todo el archivo de vuelta como un nuevo xml o sobre escribir el código XML existente. Actualmente, todo lo que estoy escribiendo es una línea.

from lxml import etree 
tree = etree.parse('addressbook.xml') 
root = tree.getroot() 
oSetroot = etree.Element(root.tag) 
NewSub = etree.SubElement (oSetroot, 'CREATE_NEW_SUB') 
doc = etree.ElementTree (oSetroot) 
doc.write ('addressbook1.xml') 

TIA

+0

nota que he editado su Q para formatear el código XML legible y - al escribir un Q que contiene código (o el como, por ejemplo, XML), resalte esos bloques y haga clic en el ícono que se asemeja a un pequeño cuadrado de 0 y 1 en la línea de iconos justo arriba del texto: esta es la forma más simple de lograr el formateo (simplemente sangría todo el bloque cuatro espacios y asegurarse de que haya líneas vacías antes y después es equivalente; eso es lo que hace clic en el icono para usted, por cierto ;-). –

+0

@Alex, muchas gracias por aprender en tan poco tiempo +1000 señor –

Respuesta

16

Usted podría hacer un nuevo árbol copiando sobre todo del anterior (no sólo la etiqueta raíz -!), Pero es mucho más simple para editar el árbol existente en -lugar (y, por qué no? -) ...:

tree = etree.parse('addressbook.xml') 
root = tree.getroot() 
NewSub = etree.SubElement (root, 'CREATE_NEW_SUB') 
tree.write ('addressbook1.xml') 

que pone en addressbook1.xml:

<addressbook> 
    <person> 
     <name>Eric Idle</name> 
     <phone type="fix">999-999-999</phone> 
     <phone type="mobile">555-555-555</phone> 
     <address> 
      <street>12, spam road</street> 
      <city>London</city> 
      <zip>H4B 1X3</zip> 
     </address> 
    </person> 
<CREATE_NEW_SUB /></addressbook> 

(que espero es el efecto que buscas ... -?)

+0

¡Sí, es exactamente! ** Golpeando la cabeza en la mesa ** ¡Gracias! –

+5

@ Nathaniel, de nada! Una vez que hayas probado la sugerencia de la respuesta, si funciona bien y te ha ayudado, recuerda "aceptar" la respuesta (haciendo clic en el ícono en forma de marca de cotejo a la izquierda de la respuesta): ¡esa es la etiqueta de desbordamiento de la pila! -). –

Cuestiones relacionadas