Я новичок в питоне, так что помогите. Я хотел бы добавить индекс к элементам row и column так же, как элементы page имеют индекс.
На странице 1 есть 4 строки, поэтому индекс будет меняться от 0 до 3. На странице 1 в строке 0 есть только один столбец, поэтому индекс будет только 0. На странице 1, в строке 2 есть 3 столбца, поэтому индекс для столбцов будет меняться от 0 до 2. То же самое для других строк на других страницах.
Я начал тестировать Elementree, но только основы для печати элементов. Может быть, кто-то мог бы помочь мне с этим.
У меня есть следующий код только для базовых тестов, но я не знаю, как это сделать.
import xml.etree.ElementTree as ET
tree = ET.parse('smp.xml')
root = tree.getroot()
for text in root.iter('text'):
print(text.attrib)
for text in root.iter('text'):
print(text.text)
Входной XML выглядит следующим образом:
<?xml version = "1.0"?>
<doc>
<page index = "0"/>
<page index = "1">
<row>
<column>
<text>fibrous drupe</text>
</column>
</row>
<row>
<column>
<text>follicle</text>
</column>
<column>
<text>legume</text>
</column>
</row>
<row>
<column>
<text>loment</text>
</column>
<column>
<text>nut</text>
</column>
<column>
<text>samara</text>
</column>
</row>
<row>
<column>
<text>schizocarp</text>
</column>
</row>
</page>
<page index = "2">
<row>
<column>
<text>cypsela</text>
</column>
</row>
</page>
<page index = "3"/>
</doc>
и я хотел бы преобразовать его в это:
<?xml version = "1.0"?>
<doc>
<page index = "0"/>
<page index = "1">
<row index = "0">
<column index = "0">
<text>fibrous drupe</text>
</column>
</row>
<row index = "1">
<column index = "0">
<text>follicle</text>
</column>
<column index = "1">
<text>legume</text>
</column>
</row>
<row index = "2">
<column index = "0">
<text>loment</text>
</column>
<column index = "1">
<text>nut</text>
</column>
<column index = "2">
<text>samara</text>
</column>
</row>
<row index = "3">
<column index = "0">
<text>schizocarp</text>
</column>
</row>
</page>
<page index = "2">
<row index = "0">
<column index = "0">
<text>cypsela</text>
</column>
</row>
</page>
<page index = "3"/>
</doc>
Я надеюсь, что смысл. Заранее спасибо.






Я новичок в python, поэтому вам нужно закончить это самостоятельно:
import xml.etree.ElementTree as ET
tree = ET.parse('smp.xml')
root = tree.getroot()
for text in root:
print(text.tag, text.attrib)
for text2 in text:
print(" ", text2.tag, text2.attrib)
if (text2.tag=='row'):
text2.set('index','42')
tree.write('output.xml')
В «output.xml» вы получите:
<doc>
<page index = "0" />
<page index = "1">
<row index = "42">
<column>
<text>fibrous drupe</text>
</column>
</row>
<row index = "42">
<column>
<text>follicle</text>
</column>
<column>
<text>legume</text>
</column>
</row>
<row index = "42">
<column>
….
Итак, вам нужно изменить эти «42» на значение, которое вам нужно. ?
@Парфе Привет. Мне не подходит решение :(
@Parfait не является ошибкой, просто вывод не такой, как ожидалось.
@Ger: Тебе нужна помощь с этим? или.... (Я немного запутался, что делать, когда читал комментарии выше ?)
@Luuk Спасибо за помощь, Луук. Поскольку оба являются новыми для Python, мы можем извлечь выгоду из решения Бальдермана, которое работает, как и ожидалось. Спасибо, в любом случае
Смотри ниже
(«56403870.xml» — это опубликованный вами XML)
import xml.etree.ElementTree as ET
tree = ET.parse('56403870.xml')
root = tree.getroot()
pages = root.findall('.//page')
for page in pages:
rows = page.findall('.//row')
for r, row in enumerate(rows):
row.attrib['index'] = str(r)
columns = row.findall('.//column')
for c, col in enumerate(columns):
col.attrib['index'] = str(c)
ET.dump(tree)
выход
<doc>
<page index = "0" />
<page index = "1">
<row index = "0">
<column index = "0">
<text>fibrous drupe</text>
</column>
</row>
<row index = "1">
<column index = "0">
<text>follicle</text>
</column>
<column index = "1">
<text>legume</text>
</column>
</row>
<row index = "2">
<column index = "0">
<text>loment</text>
</column>
<column index = "1">
<text>nut</text>
</column>
<column index = "2">
<text>samara</text>
</column>
</row>
<row index = "3">
<column index = "0">
<text>schizocarp</text>
</column>
</row>
</page>
<page index = "2">
<row index = "0">
<column index = "0">
<text>cypsela</text>
</column>
</row>
</page>
<page index = "3" />
</doc>
Спасибо балдерман. Это работает хорошо. Я вижу нужно 3 петли!
Большое спасибо за вашу помощь и ваш подход к тому, как выполнить этот Luuk. С наилучшими пожеланиями