У меня есть такой файл 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 а |б тр |ю
Большое спасибо. Я пробовал с другим парсером xml, но не понял решения.






Вы можете использовать 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 только с одним 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)
Результат:
Такая структура XML приводит к ошибке, если вы попытаетесь ее проверить.