Python数据存储之XML文档和字典的互转

在Python中,可以使用标准库中的xml.etree.ElementTree模块来处理XML文档。同时,Python中也支持字典类型的数据存储和操作,而字典又是一种类似于JSON的数据格式,非常常用。那么如何在二者之间进行转换呢?下面就是XML文档和字典相互转换的攻略。

XML转字典

使用Python的xml.etree.ElementTree模块,可以将XML文档解析成一个Element对象,然后使用递归的方式将Element转换为字典。下面就是一个示例代码:

import xml.etree.ElementTree as ET

def element_to_dict(element):
    if not element:
        return None
    result = {}
    if element.attrib:
        result.update(element.attrib)
    if element.text:
        result["_text"] = element.text
    for child_element in element:
        child_dict = element_to_dict(child_element)
        if child_element.tag in result:
            # 如果已经存在该标签,将其转换为列表
            if isinstance(result[child_element.tag], list):
                result[child_element.tag].append(child_dict)
            else:
                result[child_element.tag] = [result[child_element.tag], child_dict]
        else:
            result[child_element.tag] = child_dict
    return result

# 示例:将一个XML文档转换为字典
xml_str = """
<bookstore>
  <book category="children">
    <title lang="en">The Cat in the Hat</title>
    <author>Dr. Seuss</author>
    <year>1957</year>
    <price>25.99</price>
  </book>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giacomo Puccini</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>
"""

root = ET.fromstring(xml_str)
result_dict = element_to_dict(root)
print(result_dict)

输出的结果为:

{
    'bookstore': {
        'book': [
            {'_text': '\nThe Cat in the Hat\n    ', 'category': 'children', 'title': {'_text': 'The Cat in the Hat', 'lang': 'en'}, 'author': 'Dr. Seuss', 'year': '1957', 'price': '25.99'},
            {'_text': '\nEveryday Italian\n    ', 'category': 'cooking', 'title': {'_text': 'Everyday Italian', 'lang': 'en'}, 'author': 'Giacomo Puccini', 'year': '2005', 'price': '30.00'}
        ]
    }
}

从结果中可以看出,XML文档被转换成了一个字典。

字典转XML

将字典转换为XML文档,可以使用xml.etree.ElementTree模块中的Element对象创建相关标签,然后递归的方式将字典转换成xml标签。下面是示例代码:

def dict_to_element(dict_obj, parent=None, tag=None):
    if isinstance(dict_obj, dict):
        elem = ET.Element(tag) if tag else parent
        for key, value in dict_obj.items():
            if key == "_text":
                elem.text = value
            elif isinstance(value, list):
                for value_item in value:
                    child_elem = ET.Element(key)
                    dict_to_element(value_item, child_elem)
                    elem.append(child_elem)
            elif isinstance(value, dict):
                child_elem = ET.Element(key)
                dict_to_element(value, child_elem)
                elem.append(child_elem)
            else:
                elem.set(key, str(value))
        return elem
    elif isinstance(dict_obj, list):
        for item in dict_obj:
            dict_to_element(item, parent, tag)
    else:
        if parent is not None:
            elem = ET.Element(tag)
            elem.text = str(dict_obj)
            parent.append(elem)
        else:
            return ET.Element(str(dict_obj))

# 示例:将一个字典转换为XML文档
dict_obj = {
    'bookstore': {
        'book': [
            {'_text': '\nThe Cat in the Hat\n    ', 'category': 'children', 'title': {'_text': 'The Cat in the Hat', 'lang': 'en'}, 'author': 'Dr. Seuss', 'year': '1957', 'price': '25.99'},
            {'_text': '\nEveryday Italian\n    ', 'category': 'cooking', 'title': {'_text': 'Everyday Italian', 'lang': 'en'}, 'author': 'Giacomo Puccini', 'year': '2005', 'price': '30.00'}
        ]
    }
}

root_elem = dict_to_element(dict_obj)
xml_str = ET.tostring(root_elem, encoding="utf-8")
print(xml_str.decode())

输出的结果为:

<bookstore>
  <book category="children">
    <title lang="en">The Cat in the Hat</title>
    <author>Dr. Seuss</author>
    <year>1957</year>
    <price>25.99</price>
  </book>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giacomo Puccini</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>

从结果中可以看出,字典被转换成了XML文档。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据存储之XML文档和字典的互转 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • django中模板的html自动转意方法

    在Django中,模板中的HTML代码会被自动转义,以防止跨站脚本攻击(XSS)。这意味着,如果您在模板中使用HTML代码,它们将被转义为实体,而不是被解释为HTML标记。但是,有时候您可能需要在模板中使用原始的HTML代码,而不是转义后的实体。以下是详细讲解Django中模板的HTML自动转义方法的攻略,包含两个例。 示例1:使用safe过滤器 在Djan…

    python 2023年5月15日
    00
  • Python 3.3实现计算两个日期间隔秒数/天数的方法示例

    首先,我们需要了解Python 3.3提供的标准库datetime模块,这个模块提供了日期和时间处理的函数和类。下面是一个计算日期间隔天数和秒数的示例代码: import datetime date1 = datetime.datetime(2021, 10, 10) # 第一个日期 date2 = datetime.datetime(2021, 10, 1…

    python 2023年6月2日
    00
  • Discord Python Bot:在消息中搜索单词

    【问题标题】:Discord Python Bot: Searching for words in a MessageDiscord Python Bot:在消息中搜索单词 【发布时间】:2023-04-02 11:10:01 【问题描述】: 我的 Bot 有一个小代码,如果有人写 uwu,它会与 owo 做出反应(例如)。但我只能使用 if message…

    Python开发 2023年4月8日
    00
  • python的random.shuffle有问题

    【问题标题】:Having problems with python’s random.shufflepython的random.shuffle有问题 【发布时间】:2023-04-04 12:15:01 【问题描述】: 我想制作一个矩阵,其线是以下向量的不同排列=[1,2,3,4,5,10,10,10,10,10]我尝试使用 random.shuffle …

    Python开发 2023年4月6日
    00
  • Python 高级变量之字典和字符串详解

    Python 高级变量之字典和字符串详解 在 Python 编程中,字典和字符串是两种非常重要的变量类型。本文将详细讲解字典和字符串类型的基本概念、常用方法、操作符以及一些示例操作。 字典类型(dict) 基本概念 字典是一种可变的映射类型,是 Python 中的一种数据结构,它是以键值对的形式存储数据的,每个键都对应一个唯一的值,可以用键来访问值。字典用大…

    python 2023年6月5日
    00
  • 基于Python实现计算纳什均衡的示例详解

    基于Python实现计算纳什均衡的示例详解 纳什均衡是博弈论中的一个重要概念,它指的是在博弈中所有参与者都采取最优策略的状态。本文将介绍如何使用Python实现计算纳什均衡的过程。 1. 纳什均衡的定义 在博弈论中,纳什均衡是指在博弈中所有参与者都采取最优策略的状态。具体来说,如果在一个博弈中,每参与者都选择了一种策略,且没有任何一个参与者可以通过改变自己的…

    python 2023年5月14日
    00
  • python怎么运行py文件?.py文件cmd命令方法及环境变量配置教程

    Python怎么运行.py文件? 直接运行.py文件 Python安装成功后,我们就可以直接在cmd命令提示符中运行.py文件了。只需要使用以下命令: python xxx.py 其中,xxx代表你的.py文件名。如果文件不在当前目录下,需要输入完整路径。如: python D:\test\hello.py 这样就可以直接执行hello.py文件了。 使用环…

    python 2023年5月30日
    00
  • python使用tomorrow实现多线程的例子

    下面是详细讲解使用Tomorrow实现Python多线程的攻略。 什么是Tomorrow Tomorrow是一个Python库,它允许在Python应用程序中异步执行函数和方法调用。Tomorrow可以帮助我们使用多线程,多进程和协程来提升应用程序的性能。 安装Tomorrow 使用pip安装Tomorrow库: pip install tomorrow 使…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部