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日

相关文章

  • Python爬虫学习之翻译小程序

    Python爬虫学习之翻译小程序攻略 本攻略将介绍如何使用Python编写一个简单的翻译小程序,主要分为以下步骤: 确定翻译网站和网页结构 安装必要的Python库 编写Python代码实现翻译功能 完善程序并进行测试 1. 确定翻译网站和网页结构 在编写翻译程序之前,需要确定使用的翻译网站和该网站的网页结构。本攻略将使用有道翻译作为翻译网站,并以Chrom…

    python 2023年5月23日
    00
  • Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

    Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解 什么是PyAutoGUI模块 PyAutoGUI是一款用于控制鼠标和键盘的Python模块。它可以在Windows、macOS和Linux上工作,实现的任务包括单击、双击、拖动、按键、松开按键等等。在自动化测试、GUI自动化、脚本测试等领域都有广泛的应用。 安装PyAutoGUI 可以在命…

    python 2023年5月19日
    00
  • python线程池 ThreadPoolExecutor 的用法示例

    下面是关于 Python 的线程池 ThreadPoolExecutor 的用法示例攻略。 什么是 ThreadPoolExecutor ThreadPoolExecutor 是 Python 库里的一个线程池库,用于管理和调度线程。通过使用线程池,可以简化线程的创建、维护和销毁等操作,提高线程的利用率和效率。 ThreadPoolExecutor 的基础用…

    python 2023年5月19日
    00
  • Python调用C/C++动态链接库的方法详解

    Python调用C/C++动态链接库的方法详解 什么是动态链接库? 动态链接库(Dynamic Link Library,缩写为DLL)是一种采用共享机制的可重定位的程序模块,能够在程序运行时被动态地装载和链接。在操作系统的运行时,当某个软件需要使用某个功能时,运行时库可以自动检测并载入这个动态链接库,使该软件最终能够使用这个功能。DLL在Windows操作…

    python 2023年5月13日
    00
  • 浅谈Python中数据解析

    Python中的数据解析是指从各种数据源中提取数据并进行处理的过程。数据源可以是文件、数据库、API等。Python提供了多种数据解析工具和库,可以帮助我们快速解析各种数据。本文将介绍Python中的数据解析方法和技巧。 1. 解析CSV文件 CSV文件是一种常见的数据格式,通常用于存储表格数据。Python中的csv模块可以帮助我们解析CSV文件。以下是一…

    python 2023年5月13日
    00
  • PyQt5使用mimeData实现拖拽事件教程示例解析上

    PyQt5是最流行的Python GUI工具包之一,它允许用户使用Python语言通过简单而有效的方式创建GUI应用程序。其中一个非常常用的功能就是拖拽(drag and drop)操作。在本文中,我们将详细讲解如何使用mimeData来实现拖拽操作,并提供两个示例来演示如何利用mimeData进行拖拽操作。 介绍 拖拽操作(drag and drop)是指…

    python 2023年6月13日
    00
  • Python实现随机生成有效手机号码及身份证功能示例

    下面我将为你详细讲解“Python实现随机生成有效手机号码及身份证功能示例”的攻略。 1. 生成有效手机号码 步骤一:导入 Python 的 random 和 re 模块 在 Python 中生成随机号码,需要使用 random 模块生成随机数。而在生成有效手机号码时,需要用到正则表达式来限制号码的格式。因此,需要导入 Python 的 random 和 r…

    python 2023年6月3日
    00
  • Python多进程方式抓取基金网站内容的方法分析

    下面是“Python多进程方式抓取基金网站内容的方法分析”的完整攻略。 理解多进程方式 Python多进程方式是用于实现进程并发的一种技术,可以利用多个CPU核心、降低程序单次执行时间、提高系统资源利用率等特点,进行高效的并行处理和资源调度。在抓取基金网站内容时,多进程方式可以有效提高爬取速度,提高效率。 实现多进程方式 导入必要库 首先,需要导入多进程、时…

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