簡體   English   中英

附加到python中的XML結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM