如何 select XML child 标记并以 pythonic 方式使用自定义键填充字典列表
How to select XML child tags and fill a list of dicts with custom keys in a pythonic way
我想在这里玩跑酷。从 AccessDB table 中获取导出的 xml 文件。我想 select 只是来自每个 child 的特定标签并将它们保存在字典中,创建这些字典的列表,然后用该列表填充 SQLite 自定义模型数据库。 "Extract and convert"
我设法解析了 XML,获取了 child 并找到了标签及其文本。问题是它变得很难看,因为一些 childs 没有我正在寻找的标签,因此它错过了关键,但我想将其默认为 "na" 并且我的代码是在 for 循环下有很多 if 语句,有点混乱。我也设法用peewee将记录保存在数据库中。
基本上我想从 AccessDB table 中提取数据,获取一些字段数据并将它们保存在具有不同字段名称的 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()
我不是初学者,但仍然需要学习,我确定我遗漏了一些东西,更 "pythonic" 更简单的编写方式或者更简单的方法我太迟钝了查看。我的意思是,我的代码可以工作......"sort of",但它真的很丑陋而且不完整,检查 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)
这是这个特定部分的最终工作代码,似乎可以解决问题。为我的新数据库模型结构添加了缺少的 child 的 "na"。
出于某种原因,我不明白为什么如果我为每个节点循环声明一个全局 dict() 和 .clear() 它,而不是我发布的内容,它会用重复的最后一个节点数据填充我的列表对于整个节点数。任何人都可以阐明一下吗?
在您的数据中为标签和所需键声明字典
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
未测试,未发布结构化数据。
我想在这里玩跑酷。从 AccessDB table 中获取导出的 xml 文件。我想 select 只是来自每个 child 的特定标签并将它们保存在字典中,创建这些字典的列表,然后用该列表填充 SQLite 自定义模型数据库。 "Extract and convert"
我设法解析了 XML,获取了 child 并找到了标签及其文本。问题是它变得很难看,因为一些 childs 没有我正在寻找的标签,因此它错过了关键,但我想将其默认为 "na" 并且我的代码是在 for 循环下有很多 if 语句,有点混乱。我也设法用peewee将记录保存在数据库中。
基本上我想从 AccessDB table 中提取数据,获取一些字段数据并将它们保存在具有不同字段名称的 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()
我不是初学者,但仍然需要学习,我确定我遗漏了一些东西,更 "pythonic" 更简单的编写方式或者更简单的方法我太迟钝了查看。我的意思是,我的代码可以工作......"sort of",但它真的很丑陋而且不完整,检查 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)
这是这个特定部分的最终工作代码,似乎可以解决问题。为我的新数据库模型结构添加了缺少的 child 的 "na"。
出于某种原因,我不明白为什么如果我为每个节点循环声明一个全局 dict() 和 .clear() 它,而不是我发布的内容,它会用重复的最后一个节点数据填充我的列表对于整个节点数。任何人都可以阐明一下吗?
在您的数据中为标签和所需键声明字典
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
未测试,未发布结构化数据。