Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将xml转换为带有标记值的字典_Python_Xml_Dictionary_Elementtree - Fatal编程技术网

Python 将xml转换为带有标记值的字典

Python 将xml转换为带有标记值的字典,python,xml,dictionary,elementtree,Python,Xml,Dictionary,Elementtree,我有一个XML,它具有每个标记的属性,如下所示: 这使得属性大小写与此相同,而不是标记?您链接的答案是使用所谓的what's call。这是一个非常简单而优雅的解决方案,因为它将在元素树的每个级别上执行相同的操作,以生成该级别的dict,这样函数就可以递归地调用自己 但是如果我理解正确的话,您将根据您在ElementTree结构中所处的级别来获取每个标记的不同属性,以用作dict键,然后您将在底部级别将其向上切换,以使用标记名作为键,并使用文本作为值。所以我无法想出一个像你链接的答案中那样优雅

我有一个XML,它具有每个标记的属性,如下所示:



这使得属性大小写与此相同,而不是标记?

您链接的答案是使用所谓的what's call。这是一个非常简单而优雅的解决方案,因为它将在
元素树的每个级别上执行相同的操作,以生成该级别的
dict
,这样函数就可以递归地调用自己

但是如果我理解正确的话,您将根据您在
ElementTree
结构中所处的级别来获取每个标记的不同属性,以用作
dict
键,然后您将在底部级别将其向上切换,以使用标记名作为键,并使用文本作为值。所以我无法想出一个像你链接的答案中那样优雅的解决方案

我们也可以使用dict理解,但我们将不得不使用它几次(至少对于我提出的解决方案)

听起来您希望得到一个类似这样的
dict
(给定示例XML):

{
"2016-1-01": {
"12:00": {
“a”:“155.5”,
“b”:“85.5”,
“c”:“0.42”,
},
"00:00": {
“a”:“211.3”,
“b”:“78.94”,
“c”:“0.6”,
},
},
}
为此,您需要3个函数;1处理创建每个级别的
dict
(天、小时和变量)。下面是它们的样子:

def month\u etree\u to dict(月份):
d_list=month.getchildren()
d_dict={d.attrib[“Day”]:Day_etree_to_dict(d)for d in d_list}
退票
定义日期(日期):
h_list=day.getchildren()
h_dict={h.attrib[“Hour”]:h_etree_to_dict(h)for h in h_list}
返回h_dict
定义小时数(小时):
v_list=hour.getchildren()[0].getchildren()
v_dict={v.tag:v.text for v in v_list}
返回v_dict
函数
month\u etree\u to\u dict
生成一个
dict
,其中键是每天的日期。这些值是使用
day\u etree\u to\u dict
函数生成的字典。
day\u etree\u to_dict
函数通过调用
hour\u etree\u to_dict
函数对每个小时执行相同的操作。
hour\u etree\u to dict
函数的工作原理稍有不同,它在
ElementTree
中向下跳一个额外的级别,这样它就可以遍历
元素的子元素(
)使用它们的标记名作为dict的键,并使用它们的文本作为值


我希望这是有意义的,并且对您有用。

您链接的答案是使用所谓的what's Call。这是一个非常简单而优雅的解决方案,因为它将在
元素树的每个级别上执行相同的操作,以生成该级别的
dict
,这样函数就可以递归地调用自己

但是如果我理解正确的话,您将根据您在
ElementTree
结构中所处的级别来获取每个标记的不同属性,以用作
dict
键,然后您将在底部级别将其向上切换,以使用标记名作为键,并使用文本作为值。所以我无法想出一个像你链接的答案中那样优雅的解决方案

我们也可以使用dict理解,但我们将不得不使用它几次(至少对于我提出的解决方案)

听起来您希望得到一个类似这样的
dict
(给定示例XML):

{
"2016-1-01": {
"12:00": {
“a”:“155.5”,
“b”:“85.5”,
“c”:“0.42”,
},
"00:00": {
“a”:“211.3”,
“b”:“78.94”,
“c”:“0.6”,
},
},
}
为此,您需要3个函数;1处理创建每个级别的
dict
(天、小时和变量)。下面是它们的样子:

def month\u etree\u to dict(月份):
d_list=month.getchildren()
d_dict={d.attrib[“Day”]:Day_etree_to_dict(d)for d in d_list}
退票
定义日期(日期):
h_list=day.getchildren()
h_dict={h.attrib[“Hour”]:h_etree_to_dict(h)for h in h_list}
返回h_dict
定义小时数(小时):
v_list=hour.getchildren()[0].getchildren()
v_dict={v.tag:v.text for v in v_list}
返回v_dict
函数
month\u etree\u to\u dict
生成一个
dict
,其中键是每天的日期。这些值是使用
day\u etree\u to\u dict
函数生成的字典。
day\u etree\u to_dict
函数通过调用
hour\u etree\u to_dict
函数对每个小时执行相同的操作。
hour\u etree\u to dict
函数的工作原理稍有不同,它在
ElementTree
中向下跳一个额外的级别,这样它就可以遍历
元素的子元素(
)使用它们的标记名作为dict的键,并使用它们的文本作为值


我希望这是有意义的,并且对您有用。

在将XML转换为dict时,我经常使用递归
defaultdict
,如下所示:

import xml.etree.ElementTree as ET
from collections import defaultdict


def Tree():
    return defaultdict(Tree)

tree = ET.parse('x.xml')
root = tree.getroot()
d = Tree()
for day in root.findall('day'):
    for hour in day.findall('hour'):
        for v in hour.findall('./Variables/*'):
            d[day.attrib['Day']][hour.attrib['Hour']][v.tag] = v.text

print d['2016-1-01']['12:00']['b']
参考:


在将XML转换为dict时,我经常使用递归
defaultdict
,如下所示:

import xml.etree.ElementTree as ET
from collections import defaultdict


def Tree():
    return defaultdict(Tree)

tree = ET.parse('x.xml')
root = tree.getroot()
d = Tree()
for day in root.findall('day'):
    for hour in day.findall('hour'):
        for v in hour.findall('./Variables/*'):
            d[day.attrib['Day']][hour.attrib['Hour']][v.tag] = v.text

print d['2016-1-01']['12:00']['b']
参考:


简直太完美了!有了你的解释,我真的理解得好多了。谢谢,没问题!很高兴我能帮忙!简直太完美了!有了你的解释,我真的理解得好多了。谢谢,没问题!很高兴我能帮忙!
import xml.etree.ElementTree as ET
from collections import defaultdict


def Tree():
    return defaultdict(Tree)

tree = ET.parse('x.xml')
root = tree.getroot()
d = Tree()
for day in root.findall('day'):
    for hour in day.findall('hour'):
        for v in hour.findall('./Variables/*'):
            d[day.attrib['Day']][hour.attrib['Hour']][v.tag] = v.text

print d['2016-1-01']['12:00']['b']