2010-09-06 16 views
7

Sono nuovo in Python/lxml Dopo aver letto il sito lxml ed essermi immerso in python, non sono riuscito a trovare la soluzione ai miei problemi n00b. Ho l'XML di esempio qui sotto:Python Lxml - Aggiunge un xml esistente con nuovi dati

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

Sto cercando di aggiungere un bambino per l'elemento radice e scrivere l'intero file indietro come un nuovo XML o sovrascrivere il XML esistente. Attualmente tutto ciò che scrivo è una linea.

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 che ho modificato il vostro Q per formattare il codice XML e leggibile - durante la scrittura di un Q, che contiene il codice (o la come, ad esempio, XML), evidenzia questi blocchi e fai clic sull'icona che assomiglia a un quadratino di 0 e 1 sulla linea di icone appena sopra il testo: questo è il modo più semplice per ottenere la formattazione (basta far rientrare l'intero blocco di quattro spazi e assicurandosi che ci siano linee vuote prima e dopo è equivalente - questo è ciò che fa clic sull'icona per te, btw ;-). –

+0

@Alex, grazie mille per imparare in così poco tempo +1000 a voi signore –

risposta

16

È potrebbe fare un nuovo albero copiando sopra tutte di quello vecchio (non solo il tag root -!), Ma è molto più semplice per modificare l'albero esistente in -Place (e, perché no? -) ...:

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

che mette in 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> 

(che spero è l'effetto che stai cercando ... -?)

+0

Sì, è esattamente! ** Schiacciando la testa sul tavolo ** Grazie! –

+5

@Nathaniel, prego! Una volta provato il suggerimento della risposta, se funziona bene e ti ha così aiutato, ricorda di "accettare" la risposta (facendo clic sull'icona a forma di segno di spunta sulla sinistra della risposta) - questa è l'etichetta core overflow dello stack! -). –

Problemi correlati