63094


python3.x xmlデータ作成で text中にタグを複数挿入したいのですが、

例えば...

[code]

    <root><aaa>あいう<bbb>えお</bbb>かきく<ccc>けこ</ccc>さしすせそ</aaa></root>
    
[/code]

というデータを作る場合、

思いつく方法は、

[code]

    import xml.etree.ElementTree as ET
    temp = "<root/>"
    root = ET.fromstring(temp)
    temp = "<aaa>あいう<bbb>えお</bbb>かきく<ccc>けこ</ccc>さしすせそ</aaa>"
    root.append(ET.fromstring(temp))
    ET.dump(root)
    
[/code]

なのですが、

他に方法はあるのでしょうか？

* * *

タグの括弧が参照文字になってしまう。

[code]

    import xml.etree.ElementTree as ET
    temp = "<root/>"
    root = ET.fromstring(temp)
    aaa = ET.SubElement(root, 'aaa')
    aaa.text = "あいう<bbb>えお</bbb>かきく<ccc>けこ</ccc>さしすせそ"
    ET.dump(root)
    #<root><aaa>あいう&lt;bbb&gt;えお&lt;/bbb&gt;かきく&lt;ccc&gt;けこ&lt;/ccc&gt;さしすせそ</aaa></root>
    
[/code]

* * *

textが上書きされてしまう。あたりまえですが。  
自分がイメージしているのは、こんな感じで appendできればいいなと思っています。

[code]

    import xml.etree.ElementTree as ET
    temp = "<root/>"
    root = ET.fromstring(temp)
    aaa = ET.SubElement(root, 'aaa')
    aaa.text = "あいう"
    bbb = ET.SubElement(aaa, 'bbb')
    bbb.text = "えお"
    aaa.text = "かきく"
    #<root><aaa>かきく<bbb>えお</bbb></aaa></root>
    
[/code]


CC BY-SA 4.0
2020-02-16T06:00:26.587
63084
2020-02-16T13:12:03.947
37851
question
python python3 xml
python3.x xmlデータ作成で text中にタグを複数挿入したい


XMLの要素に関連するテキストはtext, tail属性で設定できます。  
text属性には要素の開始タグとその最初の子要素または終了タグまでのテキスト，  
tail属性には要素の終了タグと次のタグまでのテキストを設定できます。

詳しくはPython標準ライブラリを参照してください。  
[Elementオブジェクトのtext,tail属性](https://docs.python.org/ja/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.tail)

[code]

    import xml.etree.ElementTree as ET
    temp = "<root/>"
    root = ET.fromstring(temp)
    aaa = ET.SubElement(root, 'aaa')
    aaa.text = "あいう"
    bbb = ET.SubElement(aaa, 'bbb')
    bbb.text = "えお"
    bbb.tail = "かきく"
    ccc = ET.SubElement(aaa, 'ccc')
    ccc.text = "けこ"
    ccc.tail = "さしすせそ"
    
    ET.dump(root)
    # <root><aaa>あいう<bbb>えお</bbb>かきく<ccc>けこ</ccc>さしすせそ</aaa></root>
    
[/code]


CC BY-SA 4.0
2020-02-16T13:12:03.947
63094
2020-02-16T13:12:03.947
5375
63084
answer