使用 lxml 库在 for 循环内标记

Tag inside for loop using lxml library

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

如何在 for 循环中添加另一个标签。如果我将 root 放在 for 循环中,那么它会为 1 条记录生成 xml 文件。我需要它看起来像这样。

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

通过我的代码,我得到了

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

我只需要在 for 循环中使用与 tag1 相同的标签

这适用于您想要的任意数量的标签:

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