В настоящее время я учусь кодировать в python, но работа с файлами XML доставляет мне некоторые проблемы. Я пытался написать XML -файл, используя некоторые данные, которые я отфильтровал из JSON -файла.
Файл XML, который я хочу записать, должен выглядеть следующим образом:
<?xml version='1.0' encoding='UTF-8'?>
<collection>
<work>
<title>Title</title>
<dimensions>
<width>Width (cm)</width>
<height>Height (cm)</height>
</dimensions>
<acquisition>
<number>AccessionNumber</number>
<year>year of DateAcquired</year>
</acquisition>
</work>
[...]
</collection>
Он может быть записан в одну строку в XML, так как не нужно быть красивым.
Мой python код на данный момент выглядит следующим образом:
import xml.etree.ElementTree as ET
root = ET.Element('collection')
tree = ET.ElementTree(root)
for artwork in artworks_filtered_list:
work = ET.SubElement(root, 'work')
title = ET.SubElement(work, 'title')
title.text = artwork['Title']
dimensions = ET.SubElement(work, 'dimensions')
if 'Width (cm)' in artwork:
width = ET.SubElement(dimensions, 'width')
width.text = str(artwork['Width (cm)'])
height = ET.SubElement(dimensions, 'height')
height.text = str(artwork['Height (cm)'])
acquisition = ET.SubElement(work, 'acquisition')
number = ET.SubElement(acquisition, 'number')
number.text = str(artwork['AccessionNumber'])
year = ET.SubElement(acquisition, 'year')
year.text = str(artwork['DateAcquired'][:4])
tree.write('example.xml', encoding='UTF-8', xml_declaration=True)
Поскольку ширина отсутствует в некоторых графических данных, мне нужно было проверить, существует ли она для каждой записи , В противном случае я получаю сообщение об ошибке. artworks_filtered_list - это список словарей, который содержит записи для различных произведений искусства и выглядит следующим образом:
artworks_filtered_list = [
{
"Title": "Interval",
"Artist": ["David Hartt"],
"ConstituentID": [47183],
"ArtistBio": ["Canadian, born 1967"],
"Nationality": ["Canadian"],
"BeginDate": [1967],
"EndDate": [0],
"Gender": ["Male"],
"Date": "2016",
"Medium": "Aluminum and tempered glass",
"Dimensions": 'Wall: 102 × 218 × 4" (259.1 × 553.7 × 10.2 cm)',
"CreditLine": "Fund for the Twenty First Century",
"AccessionNumber": "1772.2015.5",
"Classification": "Installation",
"Department": "Media and Performance Art",
"DateAcquired": "2015-12-11",
"Cataloged": "Y",
"ObjectID": 205745,
"URL": "http://www.moma.org/collection/works/205745",
"ThumbnailURL": None,
"Depth (cm)": 10.16002032,
"Height (cm)": 259.080518161,
"Width (cm)": 553.7211074422,
},
...,
]
Это мой код прямо сейчас. Он работает и создает XML -файл по назначению, но я чувствую, что кода может быть больше, чем нужно. Есть ли способ получить тот же результат с менее повторяющимся / более красивым кодом? (Все равно следует использовать ElementTree)