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

forループ内に別のタグを追加するにはどうすればよいですか?もしループの中にループを入れたら、それは1レコード分のXMLファイルを生成します。私はこれのように見える必要があります。私のコードでlxmlライブラリを使用してforループ内にタグをつける

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

私はちょうどこれは、あなたがしたいタグの任意の数のために働くのループ

+0

私の質問が更新されました。コードはここに投稿するのが巨大なので、できるだけ簡略化しようとしました。 – Chaban33

+0

あなたのコードは単にタグ 'TAG1'をルートに入れます。 'tag2'はあなたのコードには載っていません。 tag2 = etree.SubElement(root、 'tag2') 'のように新しい変数にtag2を入れ、' po_code = etree.SubElement(tag2、 'data')の代わりにtag2を使うように変数po_codeを変更する必要があります。text = str(inv.id) ' – afwanwh

答えて

0

のためだけの内部TAG1と同じタグを必要とする

 <tag1> 
      <data>my data<data> 
     </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)) 
関連する問題