如何以pythonic方式选择XML子标签并用自定义键填充字典列表

时间:2019-06-20 16:28:43

标签: python xml dictionary elementtree

我正在这里做一些跑酷运动。从AccessDB表中获取导出的xml文件。我想从每个孩子中仅选择特定标签并将其保存在字典中,创建这些字典的列表,然后使用该列表填充SQLite自定义模型数据库。 “提取并转换”

我设法解析XML,获取子元素并找到标签及其文本。事实是,由于某些孩子没有我要找的标签,这变得很丑陋,因此它错过了钥匙,但我想默认将其设置为“ na”,并且我的代码有些混乱,如果for循环下的语句。我也设法用peewee将记录保存在数据库中。

基本上,我想从AccessDB表中提取数据,获取一些字段数据,并将它们保存在具有不同字段名称的sqlite db中。我在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()

我不是一个初学者,但仍然愿意学习,并且我确定我想念一些东西,一种更“ pythonic”的易于编写的方式,或者有一种更简单易用的方式,我实在不愿意看到。我的意思是,我的代码可以工作...“有点”,但这确实很丑陋且不完整,检查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 个答案:

答案 0 :(得分:1)

在数据中声明标签和所需密钥的字典

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

未经测试,未构造发布的数据。