[英]Append to XML structure in python
我想將自定義子元素更改/添加到由腳本生成的xml中。
最重要的元素是AAA:
top = Element('AAA')
collect_line看起來像這樣:
[['TY', ' RPRT'], ['A1', ' Peter'], ['T3', ' Something'], ['ER', ' ']]
然后,我一一枚舉所有行,並為top
創建一個SubElement:
for line in enumerate(collected_lines):
child = SubElement(top, line[0])
child.text = line[1]
輸出:
<?xml version="1.0" ?>
<AAA>
<TY> RPRT</TY>
<A1> Peter</A1>
<T3> Something</T3>
<ER> </ER>
<TY> RPRT2</TY>
<A1> Peter</A1>
<T3> Something2</T3>
<ER> </ER>
<TY> RPRT2</TY>
<A1> Peter</A1>
<T3> Something2</T3>
<ER> </ER>
</AAA>
我想將<ART>
元素添加到top
元素,然后像這樣打印xml:
<?xml version="1.0" ?>
<AAA>
<ART>
<TY> RPRT</TY>
<A1> Peter</A1>
<T3> Something</T3>
<ER> </ER>
</ART>
<ART>
<TY> RPRT2</TY>
<A1> Peter</A1>
<T3> Something2</T3>
<ER> </ER>
</ART>
<ART>
<TY> RPRT2</TY>
<A1> Peter</A1>
<T3> Something2</T3
</ART>
</AAA>
我試圖用if statemant做到這一點。 喜歡:
if "TY" in line:
"append somehow before TY element, <ART>"
if "ER" in line:
"append somehow after ER element, </ART>"
有解決這個問題的簡單方法嗎?
只需重新分配top
元素並使用insert
:
top = ET.Element('AAA')
# by the way you need index, element on enumerate
for i, line in enumerate(collected_lines):
child = ET.SubElement(top, line[0])
child.text = line[1]
art = top
art.tag = 'ART'
top = ET.Element('AAA')
top.insert(1, art)
ET.tostring(top)
'<AAA><ART><TY> RPRT</TY><A1> Peter</A1><T3> Something</T3><ER> </ER></ART></AAA>'
正如@twasbrillig指出的那樣,您甚至不需要enumerate
,只需一個簡單的for/loop
:
...
for line in collected_lines:
child = ET.SubElement(top, line[0])
child.text = line[1]
...
如前一個示例中所編輯的OP還詢問如何處理多個部分,這可以通過普通的Python邏輯來實現:
import xml.etree.ElementTree as ET
s = '''<?xml version="1.0" ?>
<AAA>
<TY> RPRT</TY>
<A1> Peter</A1>
<T3> Something</T3>
<ER> </ER>
<TY> RPRT2</TY>
<A1> Peter</A1>
<T3> Something2</T3>
<ER> </ER>
<TY> RPRT2</TY>
<A1> Peter</A1>
<T3> Something3</T3>
<ER> </ER>
</AAA>'''
top = ET.fromstring(s)
# assign a new Element to replace top later on
new_top = ET.Element('AAA')
# get all indexes where TY, ER are at
ty = [i for i,n in enumerate(top) if n.tag == 'TY']
er = [i for i,n in enumerate(top) if n.tag == 'ER']
# top[x:y] will get all the sibling elements between TY, ER (from their indexes)
nodes = [top[x:y] for x,y in zip(ty,er)]
# then loop through each nodes and insert SubElement ART
# and loop through each node and insert into ART
for node in nodes:
art = ET.SubElement(new_top, 'ART')
for each in node:
art.insert(1, each)
# replace top Element by new_top
top = new_top
# you don't need lxml, I just used it to pretty_print the xml
from lxml import etree
# you can just ET.tostring(top)
print etree.tostring(etree.fromstring(ET.tostring(top)), \
xml_declaration=True, encoding='utf-8', pretty_print=True)
<?xml version='1.0' encoding='utf-8'?>
<AAA>
<ART><TY> RPRT</TY>
<T3> Something</T3>
<A1> Peter</A1>
</ART>
<ART><TY> RPRT2</TY>
<T3> Something2</T3>
<A1> Peter</A1>
</ART>
<ART><TY> RPRT2</TY>
<T3> Something3</T3>
<A1> Peter</A1>
</ART>
</AAA>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.