python操作XML格式文件的一些常见方法

作者:荼靡, 时间:2023-02-10 00:06:12 

前言

可扩展标记语言,是一种简单的数据存储语言,XML被设计用来传输和存储数据

  • 存储,可用来存放配置文件,例:java配置文件

  • 传输,网络传输以这种格式存在,例:早期ajax传输数据等

<data>
   <country name="Liechtenstein">
       <rank updated="yes">2</rank>
       <year>2023</year>
       <gdppc>141100</gdppc>
       <neighbor direction="E" name="Austria" />
       <neighbor direction="W" name="Switzerland" />
   </country>
   <country name="Singapore">
       <rank updated="yes">5</rank>
       <year>2026</year>
       <gdppc>59900</gdppc>
       <neighbor direction="N" name="Malaysia" />
   </country>
   <country name="Panama">
       <rank updated="yes">69</rank>
       <year>2026</year>
       <gdppc>13600</gdppc>
       <neighbor direction="W" name="Costa Rica" />
       <neighbor direction="E" name="Colombia" />
   </country>
</data>

1. 读取文件和内容

#导包
from xml.etree import ElementTree as ET

# ET去打开xml文件
tree = ET.parse("files/xo.xml")
# 获取根标签
root = tree.getroot()
print(root) # <Element 'data' at 0x7f94e02763b0>

2.读取节点数据

获取根标签

root = ET.XML(content)

查找节点【默认找第一个】 find()

country_object = root.find("country")
print(country_object)  #<Element 'country' at 0x0000020D57DFB220>

获取节点标签 tag

country_object.tag  #country

获取节点属性 attrib

country_object.attrib   #{'name': 'Liechtenstein'}

获取节点文本 text

gdppc_object.text    #141100

循环节点

# 获取data标签的孩子标签
for child in root:
   print(child.tag, child.attrib)
   #获取child标签的孩子标签
   for node in child:
       print(node.tag, node.attrib, node.text)

查找所有标签 iter()

# 获取data里面所有year标签
for child in root.iter('year'):
   print(child.tag, child.text)

查找所有标签 findall()

# 查找所有的country标签
v1 = root.findall('country')

查找标签

# 查找country里面的rank标签,找第一个
v2 = root.find('country').find('rank')

3.修改和删除节点

【修改和删除内容只在内存中修改,没有存到文件中,都要重新保存文件】

修改节点内容

#修改rank文本
rank.text = "999"
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

修改节点属性

#修改rank属性
rank.set('update', '2020-11-11')
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

保存文件

tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

删除节点

root.remove( root.find('country') )
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

4.构建文档 方式一ET.Element()

<home>
   <son name="儿1">
       <grandson name="儿11"></grandson>
       <grandson name="儿12"></grandson>
   </son>
   <son name="儿2"></son>
</home>
from xml.etree import ElementTree as ET
#创建根标签
root=ET.Element('home')
# 创建大儿子,与root还没有关系
son1=ET.Element('son',{'name':'儿1'})
#创建小儿子,与root还没有关系
son2=ET.Element('son',{'name':'儿2'})

#创建2个孙子
grandson1=ET.Element('grandson',{'name':'儿11'})
grandson2=ET.Element('grandson',{'name':'儿12'})

# 创建两个孙子,与son1还没有关系
son1.append(grandson1)
son1.append(grandson2)

# 把儿子添加到根节点
root.append(son1)
root.append(son2)

#root节点放到根节点中
tree=ET.ElementTree(root)
#保存xml文件
# short_empty_elements=True,节点中没有元素,用简写方式显示例:<grandson name="儿11" />
tree.write('file/root.xml',encoding='utf-8',short_empty_elements=True)

方式二 标签.makeelement()

<famliy>
   <son name="儿1">
       <grandson name="儿11"></grandson>
       <grandson name="儿12"></grandson>
   </son>
   <son name="儿2"></son>
</famliy>
from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("famliy")

# 创建大儿子,与root还没有关系
son1 = root.makeelement('son', {'name': '儿1'})

#创建小儿子,与root还没有关系
son2 = root.makeelement('son', {"name": '儿2'})

# 创建两个孙子,与son1还没有关系
grandson1 = son1.makeelement('grandson', {'name': '儿11'})
grandson2 = son1.makeelement('grandson', {'name': '儿12'})

son1.append(grandson1)
son1.append(grandson2)

# 把儿子添加到根节点中
root.append(son1)
root.append(son2)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8')

方式三 标签.SubElement(),创建标签的子标签

<famliy>
<son name="儿1">
   <age name="儿11">孙子</age>
   </son>
<son name="儿2"></son>
</famliy>
from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("famliy")

# 创建root节点的子标签大儿子
son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
# 创建root节点的子标签小儿子
son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})

# 在大儿子中创建一个孙子
grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
grandson1.text = '孙子'

et = ET.ElementTree(root)  #生成文档对象
et.write("test.xml", encoding="utf-8")

方式四

<user><![CDATA[你好呀]]</user>
from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("user")
#<![CDATA[你好呀]]直接添加到文本里
root.text = "<![CDATA[你好呀]]"

et = ET.ElementTree(root)  # 生成文档对象
et.write("test.xml", encoding="utf-8")

补充:XML文件和JSON文件互转

记录工作中常用的一个小技巧

cmd控制台安装第三方模块:

pip install xmltodict

1、XML文件转为JSON文件

新建一个1.xml文件:

<note date="23/04/2022">
   <to>tom</to>
   <from>mary</from>
   <msg>love</msg></note>

python操作XML格式文件的一些常见方法

转换代码实现:

import jsonimport xmltodictdef xml_to_json(xml_str):
   """parse是的xml解析器,参数需要
   :param xml_str: xml字符串
   :return: json字符串
   """
   xml_parse = xmltodict.parse(xml_str)
   # json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。
   # dumps()方法的ident=1,格式化json
   json_str = json.dumps(xml_parse, indent=1)
   return json_str

XML_PATH = './1.xml'  # xml文件的路径with open(XML_PATH, 'r') as f:
   xmlfile = f.read()
   with open(XML_PATH[:-3] + 'json', 'w') as newfile:
       newfile.write(xml_to_json(xmlfile))

输出结果(生成json文件):

python操作XML格式文件的一些常见方法

2、JSON文件转换为XML文件

新建test.json文件:

{
 "student": {
   "course": {
     "name": "math",
     "score": "90"
   },
   "info": {
     "sex": "male",
     "name": "name"
   },
   "stid": "10213"
 }}

python操作XML格式文件的一些常见方法

转换代码实现:

import xmltodictimport jsondef json_to_xml(python_dict):
   """xmltodict库的unparse()json转xml
   :param python_dict: python的字典对象
   :return: xml字符串
   """
   xml_str = xmltodict.unparse(python_dict)
   return xml_str

JSON_PATH = './test.json'  # json文件的路径with open(JSON_PATH, 'r') as f:
   jsonfile = f.read()
   python_dict = json.loads(jsonfile)  # 将json字符串转换为python字典对象
   with open(JSON_PATH[:-4] + 'xml', 'w') as newfile:
       newfile.write(json_to_xml(python_dict))

输出结果(生成xml文件):

python操作XML格式文件的一些常见方法

来源:https://blog.csdn.net/m0_46926492/article/details/124267616

标签:python,读取,xml文件
0
投稿

猜你喜欢

  • php 多个变量指向同一个引用($b = &$a)用法分析

    2023-11-02 23:28:11
  • asp开发中textarea常见问题

    2008-04-13 06:34:00
  • python利用标准库如何获取本地IP示例详解

    2021-10-17 07:46:07
  • Python学习之基础语法介绍

    2022-03-22 22:08:54
  • Oracle数据库的备份与恢复

    2024-01-21 02:13:58
  • python list count统计个数的实现

    2022-11-08 06:51:24
  • python文件读取失败怎么处理

    2023-05-06 17:14:46
  • Linux下mysql新建账号及权限设置方法

    2024-01-22 21:38:07
  • python子类在多继承中使用MRO机制原理

    2021-03-09 00:52:35
  • 使用Postman测试需要授权的接口问题

    2022-10-18 15:14:23
  • MySQL null的一些易错点

    2024-01-22 13:00:30
  • Selenium chrome配置代理Python版的方法

    2022-02-24 14:26:08
  • asp MD5加密方式使用建议

    2011-03-30 11:17:00
  • Python基础Lists和tuple实例详解

    2021-09-27 04:11:36
  • Python实现自动计算特定格式的时间差

    2021-08-16 22:47:24
  • MySQL中使用case when 语句实现多条件查询的方法

    2024-01-16 17:17:31
  • SQL server使用自定义函数以及游标

    2024-01-23 23:55:32
  • SQL Server 2005作业设置定时任务

    2024-01-27 13:02:59
  • 显卡驱动CUDA 和 pytorch CUDA 之间的区别

    2021-12-29 04:35:31
  • 教你使用Psycopg2连接openGauss的方法

    2023-09-17 02:56:39
  • asp之家 网络编程 m.aspxhome.com