2017-09-18 68 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))