2017-09-18 28 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 

如何在循环内添加另一个标签。如果我把root放入for循环,那么它会为1条记录生成xml文件。我需要它看起来像这样。使用lxml库的内部for循环标签

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

我的代码我得到

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

我只需要相同的标签标记1只在for循环

+0

我更新了我的问题,希望它有帮助。代码是巨大的发布在这里,我试图尽可能简化它。 – Chaban33

+0

你的代码只是把标签'TAG1'放在根目录下。 'tag2'没有放在你的代码中。你需要把tag2放在新的变量中,像这样'tag2 = etree.SubElement(root,'tag2')'并且改变变量po_code使用tag2而不是root'po_code = etree.SubElement(tag2,'data')。text = STR(inv.id)' – afwanwh

回答

0

这适用于任意数量的标签,你想:

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