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

yizhihongxing

在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日

相关文章

  • python3整数反转的实现方法

    下面是关于“Python3整数反转的实现方法”的完整攻略: 一、需求分析 需要实现将一个整数进行反转的功能,即将输入的整数按照位数反过来。例如,输入123,输出321。 二、解决方案 方法一:利用字符串反转 def reverse_num(num: int) -> int: if num < 0: return -reverse_num(-num…

    python 2023年6月5日
    00
  • twilio python自动拨打电话,播放自定义mp3音频的方法

    下面是“twilio python自动拨打电话,播放自定义mp3音频的方法”的完整攻略。 简介 Twilio是一家提供云通信服务的公司,它可以帮助开发者构建各种不同类型的通信应用程序,其中包括电话、短信、视频和语音通话等。在这篇攻略中,我们将向大家介绍如何使用Python调用Twilio API来自动拨打电话并播放自定义的MP3音频文件。 步骤 1. 注册T…

    python 2023年6月3日
    00
  • Python简单爬虫导出CSV文件的实例讲解

    首先我们需要明确一下,网页爬虫是用来从互联网上抓取数据的一种程序。而CSV是一种常用的数据格式,它是一种简单的、基于文本的表格表示方法,用于表示由逗号分隔的值(即CSV文件)。 那么,如何在Python中编写一个简单的爬虫程序,并将爬取到的数据导出为CSV文件呢?下面我会详细介绍。 一、准备工作 在开始编写爬虫程序之前,我们需要安装一些必要的Python库,…

    python 2023年6月3日
    00
  • 分享一个可以生成各种进制格式IP的小工具实例代码

    下面我来详细介绍一下如何分享一个可以生成各种进制格式IP的小工具实例代码。 步骤一:编写代码 首先,我们需要编写一个能够生成各种进制格式IP的小工具。这里我以Python语言为例,给出一个简单的代码示例: # 定义一个IP地址 ip = "192.168.1.1" # 转换成十进制格式 int_ip = int(”.join([bin(…

    python 2023年6月3日
    00
  • python学习与数据挖掘应知应会的十大终端命令

    下面是“Python学习与数据挖掘应知应会的十大终端命令”的攻略: Python学习与数据挖掘应知应会的十大终端命令 1. cd cd 是 change directory 的缩写,表示切换当前目录,可以用来进入指定目录或者返回上一级目录。 示例1:进入 Documents 目录 $ cd Documents 示例2:返回上一级目录 $ cd .. 2. l…

    python 2023年6月3日
    00
  • nx.adjacency_matrix计算邻接矩阵与真实结果不一致的解决

    在使用 nx.adjacency_matrix 函数计算邻接矩阵时,有时候会出现计算结果与预期不一致的情况,这可能是由于以下原因造成的:节点的排序可能会影响计算结果、网络图中存在对称边或自环等。本文将介绍如何解决这些问题。 问题一:节点排序对计算结果的影响 考虑以下简单的网络图: import networkx as nx G = nx.Graph() G.…

    python 2023年6月3日
    00
  • 在 Ubuntu 上安装 pip的方法

    下面是在Ubuntu上安装pip的完整攻略: 一、安装pip前的准备工作 在开始安装pip之前,我们需要先进行一些准备工作,包括更新软件源和安装必要的依赖。 更新软件源 使用以下命令更新软件源: sudo apt-get update 安装必要的依赖 使用以下命令安装必要的依赖: sudo apt-get install python3-dev python…

    python 2023年5月14日
    00
  • python 计算概率密度、累计分布、逆函数的例子

    下面是针对“python 计算概率密度、累计分布、逆函数的例子”的完整攻略: 1. 概率密度 计算概率密度通常使用的是概率密度函数(PDF),在python中可以使用scipy库的scipy.stats模块中的概率密度函数方法来计算。这里以正态分布为例,展示计算方法。 from scipy.stats import norm # 设定参数:均值为2,标准差为…

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