У меня есть такой xml
<data>
<B>Head1</B>
<I>Inter1</I>
<I>Inter2</I>
<I>Inter3</I>
<I>Inter4</I>
<I>Inter5</I>
<O>,</O>
<B>Head2</B>
<I>Inter6</I>
<I>Inter7</I>
<I>Inter8</I>
<I>Inter9</I>
<O>,</O>
<O> </O>
</data>
и я хочу, чтобы XML выглядел как
<data>
<combined>Head1 Inter1 Inter2 Inter3 Inter4 Inter5</combined>,
<combined>Head2 Inter6 Inter7 Inter8 Inter9</combined>
</data>
Я попытался получить все значения "B"
for value in mod.getiterator(tag='B'):
print (value.text)
Head1
Head2
for value in mod.getiterator(tag='I'):
print (value.text)
Inter1
Inter2
Inter3
Inter4
Inter5
Inter6
Inter7
Inter8
Inter9
Теперь как мне сохранить первое значение итерации в один тег, а затем второе в другом теге. т.е. Как заставить итерацию начинаться с тега «B», найти все теги «I», которые следуют за ним, а затем повторить итерацию снова, если я снова найду тег «B» и сохраню их все в новом теге.
тег "O" всегда будет присутствовать в конце






Вы можете использовать модуль ElementTree от xml.etree:
from xml.etree import ElementTree
struct = """
<data>
{}
</data>
"""
def reformat(tree):
root = tree.getroot()
seen = []
for neighbor in root.iter('data'):
for child in neighbor.getchildren():
tx = child.text
if tx == ',':
yield "<combined>{}<combined>".format(' '.join(seen))
seen = []
else:
seen.append(tx)
with open('test.xml') as f:
tree = ElementTree.parse(f)
print(struct.format(',\n'.join(reformat(tree))))
результат:
<data>
<combined>Head1 Inter1 Inter2 Inter3 Inter4 Inter5<combined>,
<combined>Head2 Inter6 Inter7 Inter8 Inter9<combined>
</data>
Обратите внимание: если вы не уверены, что все блоки разделены запятой, вы можете просто изменить условие if tx == ',': в соответствии с форматом вашего файла. Вы также можете проверить, когда tx запускается с помощью «Head», тогда, если seen не пустой yield, seen и очистить его содержимое, в противном случае добавьте tx и продолжите.