Как выбрать дочерние теги XML и заполнить список диктов пользовательскими ключами в стиле питон - PullRequest
2 голосов
/ 20 июня 2019

Я пытаюсь сделать паркур здесь.Получил экспортированный XML-файл из таблицы AccessDB.Я хотел бы выбрать только определенные теги для каждого дочернего элемента и сохранить их в файле dict, создать список этих сообщений, а затем заполнить базу данных пользовательской модели SQLite этим списком.«Извлечь и преобразовать»

Мне удалось разобрать XML, получить дочерние элементы и найти теги и их текст.Дело в том, что это становится уродливым, так как у некоторых детей нет тега, который я ищу, поэтому он пропускает ключ, но я бы хотел по умолчанию присвоить ему значение «na», и мой код немного запутан, еслизаявления по циклу.Мне также удалось сохранить записи в базе данных с помощью peewee.

По сути, я хочу извлечь данные из таблицы AccessDB, получить некоторые данные поля и сохранить их в базе данных sqlite с другим именем поля.Я работаю в Linux и не могу получить доступ к машине AccessDB, таким образом, экспортированный файл.Если это будет слишком хлопотно, я попытаюсь запустить скрипт и подключить обе базы данных и проанализировать данные

xml_parsing_code()

for childs in root:
    for tags in child:
        if tags.tag == 'PM':
            d['maker'] = tags.text
        if ...

    list.append(d)

db.create_code()

Я не новичок, но все еще загружаюсь, чтобы учиться, и я уверен, что ячто-то упущено, более "питонический" простой способ написания или более простой подход, который я слишком тупой, чтобы видеть.Я имею в виду, что мой код работает ... "вроде", но он действительно уродлив и нестабилен, и проверка на проблемы в списке элементов 6k - это немного больно.

Большое спасибо!

ОБНОВЛЕНИЕ 2: # (допустил ошибку, когда я перезаписывал пропущенные и уже заполненные значения)

import xml.etree.ElementTree as ET

tags_dict = {
    "PartNo": "maker_ref",
    "PM": "maker",
    etc..
}

tree = ET.parse("exported_table.xml")
root = tree.getroot()

dict_list = list()
#d = dict()
for node in root:
    d = dict() #instead of d.clear()
    for child in node:
        for k, v in tags_dict.items():
            if k in child.tag:
                d[v] = child.text
            if v not in d:
                d[v] = "na"

    dict_list.append(d)

Это последний рабочий код для этой конкретной части, который, похоже, работает.Добавил "na" для отсутствующих дочерних элементов для моей новой структуры модели базы данных.

Почему-то я не могу понять, почему, если я объявляю глобальные dict () и .clear () для каждого цикла узла, вместо того, что я опубликовал, он заполняет мой список данными последнего узлаповторяется для всего количества узлов.Кто-нибудь может пролить свет?

1 Ответ

1 голос
/ 20 июня 2019

Объявляйте dict для Tag и желаемый ключ в ваших данных

desired_tags = {"PM": "maker", etc...}

for child in root:
    for tags in child:
        for k,v in desired_tags.items():
            if k in child.tag:
                d[v] = tags.text

Не проверено, размещенные данные не структурированы.

...