Хо, чтобы разобрать файл xml в xlsx в python

У меня есть такой файл xml (вход):

> <?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?\>
> <obs id = "0"\>
> <dim name = "Column1" value = "a"/\>
> <dim name = "Column2" value = "b"/\>
> </obs\>
> <obs id = "1">
> <dim name = "Column1" value = "tr"/\>
> <dim name = "Column2" value = "yu"/\>
> </obs\>

Как я могу выполнить синтаксический анализ в файле xlsx? я хотел бы иметь файл xlsx следующим образом:

Столбец1|Колонка2 а |б тр |ю

Столбец1 Столбец2 а б тр ты

Большое спасибо. Я пробовал с другим парсером xml, но не понял решения.

Почему в 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
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать BeautifulSoup для анализа XML-документа + pandas для сохранения фрейма данных в формате CSV и/или Excel:

import pandas as pd
from bs4 import BeautifulSoup


with open("your_file.xml", "r") as f_in:
    soup = BeautifulSoup(f_in.read(), "html.parser")  # <-- you can ignore the warning or use different parser, such as `xml`

all_data = []
for obs in soup.select("obs"):
    d = {}
    for dim in obs.select("dim[name][value]"):
        d[dim["name"]] = dim["value"]

    all_data.append(d)

df = pd.DataFrame(all_data)
print(df)

df.to_csv('data.csv', index=False)

Это печатает:

  Column1 Column2
0       a       b
1      tr      yu

и сохраняет data.csv.


Входной файл был:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<obs id = "0">
<dim name = "Column1" value = "a" />
<dim name = "Column2" value = "b" />
</obs>
<obs id = "1">
<dim name = "Column1" value = "tr" />
<dim name = "Column2" value = "yu" />
</obs>

Такая структура XML приводит к ошибке, если вы попытаетесь ее проверить.

Hermann12 23.12.2022 10:35

Вам нужен правильно сформированный XML только с одним root element, например:

<?xml version = "1.0" encoding = "utf-8" standalone = "yes"?>
<root>
  <obs id = "0">
    <dim name = "Column1" value = "a"/>
    <dim name = "Column2" value = "b"/>
  </obs>
  <obs id = "1">
    <dim name = "Column1" value = "tr"/>
    <dim name = "Column2" value = "yu"/>
  </obs>
</root>

Вы можете разобрать этот xml на столбцы и строки для панд DataFrame и записать этот df на лист Excel с пандами ExcelWriter():

import xml.etree.ElementTree as ET
import pandas as pd
import openpyxl

tree = ET.parse('Excel.xml')
root = tree.getroot()

columns = []
data = []
for elem in root.iter('dim'):
    if elem.get('name') not in columns:
        columns.append(elem.get('name'))
    if elem.get('name') == "Column1":
        c1 = elem.get('value')
    else:
        c2 = elem.get('value')
        row = (c1, c2)
        data.append(row)

df = pd.DataFrame(data, columns=columns)
print(df)

with pd.ExcelWriter("Excel.xlsx") as writer:
    df.to_excel(writer) 

Результат:

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