Есть ли способ создать XML с данными из Excel, когда дочерние элементы всегда имеют одинаковую структуру? - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь создать XML с элементами из Excel.

Я хочу, чтобы дочерние элементы всегда имели одинаковый формат / структуру и передавали значения из Excel.Если в Excel есть столбец, который соответствует предварительно определенной структуре (структура имеет дочернее «имя», а в таблице Excel есть столбец «имя»), заполните его.Если есть столбец, который не соответствует ни одному из дочерних элементов в предопределенной структуре, добавьте его как «другие» дочерние элементы и оставьте оставшуюся часть структуры пустой, если она не в Excel.Сейчас я жестко кодирую данные следующим образом:

ts = time.time()
timestamp = datetime.fromtimestamp(ts, tz=timezone.utc)

root = ET.Element("conversion")
root.set("name", "My movies")
root.set("dateCreated", str(timestamp)) 
tree = ET.ElementTree(root)

movies = ET.SubElement(root, "movies")

workbook = xlrd.open_workbook("data.xls")
sheet = workbook.sheet_by_index(0)

for row in range(1, sheet.nrows):
    values = sheet.row_values(row)

    movie = ET.SubElement(movies, "movie")
    movie.set("id", str(row)) 

    title = ET.SubElement(movie, "title")
    title.text = values[0] #title value
    # Continues...

Я новичок в xml и работаю с lxml, и мне удалось создать цикл, который заполняет дочерние элементы, создавая новые подэлементы каждый раз, но яне вижу, как обобщить решение, как описано.Прямо сейчас это жестко закодировано.Я уверен, что есть способ построить подэлементы из заданной структуры и передать данные, но я искал несколько дней и, похоже, не смог их найти.Идеальным решением было бы иметь корень и просто передать структуру и данные и попытаться подогнать их под соответствующие метки (если в Excel есть столбец) и добавить в качестве «других» все данные, которые нене вписывается в структуру.Как только элемент фильма построен в цикле таким образом, я мог бы просто добавить его к корню.

Вот структура, о которой я подумал:

<?xml version="1.0" encoding="UTF-8"?>
<conversion name="My movies" dateCreated="2019-03-16T11:13:15-02:00">
    <movies>
        <movie id = 'movie_id' >
            <title>movie title</title>
            <code>movie code</title>
            <directors>
                <director>
                    <name>director name</name>
                </artist>
            </artists>
            <others>
                <others name = 'label'>other value</extra>
            </others>

Кто-нибудь знает, как это моглобыть сделано?Любая идея приветствуется.

...