2017-09-18 2 views
1
from lxml import etree 
def generate_header(self): 
    root = etree.Element('TAG1',) 
    for inv in self.env['account.invoice'].search([]): 
     po_code = etree.SubElement(root, 'data').text = str(inv.id) 
    return root 

Comment ajouter une autre balise à l'intérieur de la boucle. si je mets la racine à l'intérieur de la boucle, alors il génère un fichier xml pour 1 enregistrement. j'en ai besoin pour ressembler à ça.Balise à l'intérieur de la boucle à l'aide de la bibliothèque lxml

<tag1> 
    <tag2> 
    <data>my data<data> 
    </tag2> 
</tag1> 

avec mon code que je reçois

 <tag1> 
      <data>my data<data> 
     </tag1> 

i juste besoin même étiquette que balise1 juste à l'intérieur de la boucle

+0

j'ai mis à jour ma question espère que cela aide. le code est énorme pour le poster ici, j'ai essayé de le simplifier autant que possible. – Chaban33

+0

Votre code met juste la balise 'TAG1' en racine. 'tag2' n'est pas mis sur votre code. vous devez mettre tag2 dans une nouvelle variable comme ceci 'tag2 = etree.SubElement (root, 'tag2')' et changer la variable po_code pour utiliser tag2 au lieu de root 'po_code = etree.SubElement (tag2, 'data'). str (inv.id) ' – afwanwh

Répondre

0

Cela fonctionne pour un certain nombre de balises que vous voulez:

from lxml import etree 

def do(n_of_tags, inner_tag_name, inner_tag_text, starting_tag_num=1): 
    i = starting_tag_num 
    # create root outside loop 
    root = etree.Element('tag{}'.format(i)) 
    parent = root 
    i+= 1 
    while i <= n_of_tags: 
     # append next tag to parent and make the new tag parent 
     parent.append(etree.Element('tag{}'.format(i))) 
     parent = parent.getchildren()[0] 
     i+= 1 
    # add your own tag to last parent with text 
    etree.SubElement(parent,inner_tag_name).text = inner_tag_text 
    return root 

r = do(2,'data','my data') 
# just to see if it works 
with open('test.xml','wb') as w: 
    w.write(etree.tostring(r,pretty_print=True))