Задача
Есть файл XML. Необходимо его преобразовать к табличной форме, выделив один из элементов Элемент1 в качестве строки будущей таблицы и добавив в качестве новых колонок выбранные элементы Элемент2,.., ЭлементN, по отношению к которым Элемент1 является подчиненным. Формулировка станет яснее на примере.
<?xml version="1.0"?>
<root>
<u>Городищенский уезд
<f>ф.158 оп.3 д.2612
<v>Аришкинская волость
<s>село Аришка
<p>Абрамов Сергей Матвеевич</p>
<p>Агапов Лаврентий Степанович</p> ...
Здесь разные строки несут разную информацию. Одни из них - заголовочные - относятся к нескольким нижележащим строкам. Другие - основные
Для этого файла надо создать табличную форму на базе элемента <p>, вставив в него элементы <u>,<v>,<s>,<f>. Это должно выглядеть так
Абрамов Сергей Матвеевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
Агапов Лаврентий Степанович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
...
Колонки разделены подчеркиванием (чтобы удобнее было полученную таблицу импортировать в Эксель). Строки не зависят друг от друга, поскольку вся информация, относящаяся к строке, добавлена к ней в виде одной из колонок. Поэтому полученный файл можно сортировать, переупорядочивать, фильтровать - без потери информационной целостности.
Программа на языке Python
import xml . etree . ElementTree as ET
import re
dir = 'f:/'
g = open ( dir + 'Таблица.txt' , 'w' , encoding = 'utf-8' )
tree = ET . parse(dir + "Структура.xml")
root = tree . getroot()
data = {}; k = 0 ;
def read ( elem ):
global data , k
tag = elem .tag
if elem .text is not None :
text = re . sub ( "^\s+| \n | \r |\s+$" , '' , elem .text)
else :
text = ''
if tag in [ 'f' , 'u' , 'v' , 's' ]:
data [ tag ] = text
elif tag == 'p' :
k += 1
g . write ( ' {0:06d} ' . format ( k )+ '_' + text + '_' + data [ 'u' ]+ '_' + data [ 'v' ]+ '_' + data [ 's' ]+ '_' + data [ 'f' ]+ ' \n ' )
for chil in elem :
read( chil )
read( root )
print( 'finished' )
Программа открывает на чтение файл XML и получает из него корневой элемент.
Затем выполняется функция read, которая проходит по всем элементам.
Встречая элементы из списка [ 'f' , 'u' , 'v' , 's' ] , т.е. "заголовочные" элементы, она запоминает их текстовые значения. А встречая "основной" элемент 'p', выводит в результирующий файл очередную строку с добавлением к тексту основного элемента текстов всех запомненных ранее заголовочных элементов.
Функция рекурсивно вызывается для всех подчиненных элементов, если такие есть.
Для нашего исходного файла на выходе получается файл следующего вида
000001_Абрамов Сергей Матвеевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000002_Агапов Лаврентий Степанович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000003_Агапов Степан Васильевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000004_Агапов Трофим Савельевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000005_Агапов Федор Васильевич_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000006_Агеев Варлаам Феодорович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000007_Агеев Егор Феодорович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
000008_Агеев Николай Харитонович_Городищенский уезд_Аришкинская волость_село Аришка_ф.158 оп.3 д.2612
...
Такой файл, в отличие от исходного уже легко загрузить в Эксель, поскольку все его строки имеют одинаковую структуру.
Счастливого серфинга!
Подписаться на канал Математика и программирование
Вокруг ЕГЭ: разложить x^5+1 на множители с вещественными коэффициентами
Web Scraping: преобразовать иерархическую структуру в табличную
Web Scraping: преобразовать табличную структуру в иерархическую
Web Scraping: всероссийская перепись 1917
Как я поженил Лагранжа и сигмоиду
Интерполяция функций и правило Лопиталя
Подписаться на канал Новости из царской России
Вокруг ЕГЭ: разложить x^5+1 на множители с вещественными коэффициентами
Web Scraping: преобразовать иерархическую структуру в табличную
Web Scraping: преобразовать табличную структуру в иерархическую
Web Scraping: всероссийская перепись 1917
Как я поженил Лагранжа и сигмоиду
Оглавление статей канала "Новости из царской России"
YouTube "Новости из царской России"