脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python操作XML格式文件的一些常见方法

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

2022-07-19 09:20荼靡 Python

最近有同学询问如何利用Python处理xml文件,特此整理一篇比较简洁的操作手册,下面这篇文章主要给大家介绍了关于python操作XML格式文件的一些常见方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

 

前言

可扩展标记语言,是一种简单的数据存储语言,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格式文件的一些常见方法

 

总结

到此这篇关于python操作XML格式文件的文章就介绍到这了,更多相关python操作XML文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/m0_46926492/article/details/124267616

延伸 · 阅读

精彩推荐
  • PythonPython中的闭包

    Python中的闭包

    这篇文章主要介绍了Python中的闭包,闭包在函数中提出的概念,简单来说就是一个函数定义中引用了函数外定义的变量,并且该函数可以在其定义环境外被...

    一碗周11392022-02-22
  • Pythonpython通过正则查找微博@(at)用户的方法

    python通过正则查找微博@(at)用户的方法

    这篇文章主要介绍了python通过正则查找微博@(at)用户的方法,涉及Python正则匹配的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    liuli6502019-11-27
  • Python解决python中画图时x,y轴名称出现中文乱码的问题

    解决python中画图时x,y轴名称出现中文乱码的问题

    今天小编就为大家分享一篇解决python中画图时x,y轴名称出现中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Pywin6902021-05-24
  • Python实例讲解Python中函数的调用与定义

    实例讲解Python中函数的调用与定义

    这篇文章主要介绍了Python中函数的调用与定义,是Python入门学习中的基础知识,需要的朋友可以参考下...

    YoferZhang3772020-08-16
  • PythonPython 平方列表中每个数字的多种操作

    Python 平方列表中每个数字的多种操作

    这篇文章主要介绍了Python 平方列表中每个数字的多种操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Loewi大湿6122021-09-18
  • Python我的快递一个月没动静于是赶紧上线python快递查询系统

    我的快递一个月没动静于是赶紧上线python快递查询系统

    我的快递在路上走了一个月还没到,于是自己编写快递查询,文中通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借...

    顾木子吖6022022-01-08
  • Python如何在python 中导入 package

    如何在python 中导入 package

    这篇文章主要介绍了 如何在python中导入,package,package 在python中是一种有效组织代码,module可以是一个文件,可以通过import来导入一个module 单个文件,而,pac...

    zidea4922022-04-14
  • PythonPython迁移学习:机器学习算法

    Python迁移学习:机器学习算法

    终有一天,人工智能会像我们看待非洲平原上低级生物的化石一样看待我们。在人工智能眼中,人类只是直立行走的猿猴,用着粗糙的语言和简陋的工具,...

    今日头条2942020-12-16