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

ibl*_*asi 1 python xml dictionary elementtree

我有一个 XML,每个标签的属性如下:

<?xml version= "1.0" encoding="ISO-8859-1" ?>
<month xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="my.xsd">
    <day Day="2016-1-01">
        <hour Hour="00:00">
            <Variables>
                <a>211.3</a>
                <b>78.94</b>
                <c>0.6</c>
            </Variables>
        </hour>
        <hour Hour="12:00">
            <Variables>
                <a>155.5</a>
                <b>85.5</b>
                <c>0.42</c>
            </Variables>
        </hour>
    </day>
</month>
Run Code Online (Sandbox Code Playgroud)

我希望解析 XML 并转换为字典,但不使用标签和属性值。

我的意思是,如何能够制作类似于:

>>> print d['2016-1-01']['12:00']['b']
>>> 85.5
Run Code Online (Sandbox Code Playgroud)

真正的 XML 有更多的天数和数小时。这可能吗?

我能够解析它的唯一方法是这个,但是如果您想在不同时间查找几个不同的变量,则很困难:

# Day
for child_day in root:
    print child_day.tag, child_day.attrib

    # Hour
    for child_hour in child_day:
        print '\t', child_hour.tag, child_hour.attrib

        # Variables
        for child_Variables in child_hour:
            print '\t\t', child_Variables.find('b').text
Run Code Online (Sandbox Code Playgroud)

是否有任何类似于此答案的功能使属性案例与此相同而不是标签相同?

Sal*_*ode 5

您链接的答案是使用所谓的dict comprehension。这是一个非常简单和优雅的解决方案,因为它会在 的每个级别上做同样的事情ElementTree来生成 的那个级别dict,因此该函数可以递归地调用自己。

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

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

听起来您希望得到一个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",
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

为此,您需要 3 个函数;1 处理每个级别的创建dict(天、小时和变量)。这是它们的样子:

def month_etree_to_dict(month):
    d_list = month.getchildren()
    d_dict = {d.attrib["Day"]: day_etree_to_dict(d) for d in d_list}
    return d_dict

def day_etree_to_dict(day):
    h_list = day.getchildren()
    h_dict = {h.attrib["Hour"]: hour_etree_to_dict(h) for h in h_list}
    return h_dict

def hour_etree_to_dict(hour):
    v_list = hour.getchildren()[0].getchildren()
    v_dict = {v.tag: v.text for v in v_list}
    return v_dict
Run Code Online (Sandbox Code Playgroud)

该函数month_etree_to_dict生成一个dict,其中键是每天的日期。这些值是使用该day_etree_to_dict函数生成的字典。该day_etree_to_dict函数通过调用该hour_etree_to_dict函数每小时执行相同的操作。该hour_etree_to_dict函数的工作方式略有不同,ElementTree它在 the 中向下跳了一个额外的级别,因此它可以使用它们的标签名称作为 的键和它们的文本作为值来遍历子元素<Variables> Element<a><b>、 和<c>dict

我希望这是有道理的,对你有用。