Добавить индекс к дочерним элементам в файле XML Python

Я новичок в питоне, так что помогите. Я хотел бы добавить индекс к элементам 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
286
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я новичок в 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» на значение, которое вам нужно. ?

Большое спасибо за вашу помощь и ваш подход к тому, как выполнить этот Luuk. С наилучшими пожеланиями

Ger Cas 01.06.2019 18:51

@Парфе Привет. Мне не подходит решение :(

Ger Cas 01.06.2019 22:54

@Parfait не является ошибкой, просто вывод не такой, как ожидалось.

Ger Cas 02.06.2019 19:25

@Ger: Тебе нужна помощь с этим? или.... (Я немного запутался, что делать, когда читал комментарии выше ?)

Luuk 02.06.2019 19:47

@Luuk Спасибо за помощь, Луук. Поскольку оба являются новыми для Python, мы можем извлечь выгоду из решения Бальдермана, которое работает, как и ожидалось. Спасибо, в любом случае

Ger Cas 02.06.2019 20:26
Ответ принят как подходящий

Смотри ниже

(«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 петли!

Ger Cas 02.06.2019 20:25

Другие вопросы по теме