Добавить индекс к дочерним элементам в XML-файле Python - PullRequest
0 голосов
/ 01 июня 2019

Я новичок в 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>

Надеюсь, есть смысл. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2019

см. Ниже

(«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>
1 голос
/ 01 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...