Python对XML文件实现增删改查操作

作者:Septieme 时间:2023-11-19 20:42:03 

PYTHON 操作 XML

读取XML文件

关于XML的介绍

<data> 与 </data> 是一对标签的开始与结束

<property &hellip; /> 也是一个正确的标签,以 /> 结尾,是在标签没有嵌套内容时的简写形式

name=&ldquo;cat&rdquo;,name是<data>标签的一个属性,cat是name属性的值

description here &hellip;是<data>标签的内容,这里是一段文本。当然也可以是xml的嵌套

<data name="cat" num="10"> description here ... </data>

<property value="node" />

<country name="china">
<province name="beijing">
<school name="the sunshine school" />
</province>
</country>

准备一个demo.xml文件

<data>
   <teacher name="Albert">
       <birthday>1980</birthday>
       <gender>male</gender>
       <subject>Math</subject>
   </teacher>

<student name="Becky">
       <birthday>2000</birthday>
       <gender>female</gender>
       <hobbies>
           <hobby>skating</hobby>
           <hobby>rocks</hobby>
       </hobbies>
       <exam absence="no">
           <math>90</math>
           <english>90</english>
           <music>95</music>
       </exam>

</student>
   <student name="Cindy">
       <birthday>2001</birthday>
       <gender>female</gender>
       <hobbies>
           <hobby>reading</hobby>
           <hobby>guitar</hobby>
       </hobbies>
       <exam absence="yes">
       </exam>
   </student>

<student name="Duke">
       <birthday>2000</birthday>
       <gender>male</gender>
       <hobbies>
           <hobby>football</hobby>
           <hobby>surfing</hobby>
       </hobbies>
       <exam absence="no">
           <math>100</math>
           <english>80</english>
           <music>92</music>
       </exam>
   </student>

</data>

读取xml文件内容

# Read the .xml file
tree = ET.parse("demo.xml")
root = tree.getroot()
print(root)

结果

<Element 'data' at 0x102d80cf8>

遍历XML元素

for &hellip; in &hellip; 可以遍历当前元素的所有直接子节点

for n in root:
   # items() returns all <key, value> pairs of the tag
   print(n, n.tag , n.attrib, n.items())

结果

(<Element 'teacher' at 0x1048b9e48>, 'teacher', {'name': 'Albert'}, [('name', 'Albert')])
(<Element 'student' at 0x1048bf0f0>, 'student', {'name': 'Becky'}, [('name', 'Becky')])
(<Element 'student' at 0x1048bf3c8>, 'student', {'name': 'Cindy'}, [('name', 'Cindy')])
(<Element 'student' at 0x1048bf5f8>, 'student', {'name': 'Duke'}, [('name', 'Duke')])

想要迭代遍历当前元素的所有子节点(包括子孙节点)

for n in root.iter():
   print(n, n.tag)

结果

(<Element 'data' at 0x1052f0cf8>, 'data')
(<Element 'teacher' at 0x1052f0e48>, 'teacher')
(<Element 'birthday' at 0x1052f0d30>, 'birthday')
(<Element 'gender' at 0x1052f6080>, 'gender')
(<Element 'subject' at 0x1052f60b8>, 'subject')
(<Element 'student' at 0x1052f60f0>, 'student')
(<Element 'birthday' at 0x1052f6048>, 'birthday')
(<Element 'gender' at 0x1052f6128>, 'gender')
(<Element 'hobbies' at 0x1052f6198>, 'hobbies')
(<Element 'hobby' at 0x1052f6208>, 'hobby')
(<Element 'hobby' at 0x1052f6240>, 'hobby')
(<Element 'exam' at 0x1052f62b0>, 'exam')
(<Element 'math' at 0x1052f6320>, 'math')
(<Element 'english' at 0x1052f6390>, 'english')
(<Element 'music' at 0x1052f6400>, 'music')
(<Element 'student' at 0x1052f63c8>, 'student')
(<Element 'birthday' at 0x1052f6438>, 'birthday')
(<Element 'gender' at 0x1052f6470>, 'gender')
(<Element 'hobbies' at 0x1052f64a8>, 'hobbies')
(<Element 'hobby' at 0x1052f6518>, 'hobby')
(<Element 'hobby' at 0x1052f6588>, 'hobby')
(<Element 'exam' at 0x1052f65c0>, 'exam')
(<Element 'student' at 0x1052f65f8>, 'student')
(<Element 'birthday' at 0x1052f6630>, 'birthday')
(<Element 'gender' at 0x1052f6668>, 'gender')
(<Element 'hobbies' at 0x1052f66a0>, 'hobbies')
(<Element 'hobby' at 0x1052f6710>, 'hobby')
(<Element 'hobby' at 0x1052f6780>, 'hobby')
(<Element 'exam' at 0x1052f67b8>, 'exam')
(<Element 'math' at 0x1052f6828>, 'math')
(<Element 'english' at 0x1052f6898>, 'english')
(<Element 'music' at 0x1052f6908>, 'music')

想要选择性地迭代直接子节点

for n in root.iter('teacher'):
   print(n, n.tag)
(<Element 'teacher' at 0x100f29e48>, 'teacher')

查找XML元素

find与findall查找xml元素

# find the first element
print(root.find('student'))
# find all  elements
print(root.findall('student'))
<Element 'student' at 0x1034300f0>

[<Element 'student' at 0x1034300f0>, <Element 'student' at 0x1034303c8>, <Element 'student' at 0x1034305f8>]

demo

for n in root:
   if n.tag == 'student' and n.get('name') == 'Becky':
       exam_node = n.find('exam')
       for subject in exam_node:
           print(subject.tag + " " + subject.text)

结果

math 90
english 90
music 95

添加XML元素

p = ET.Element(tag_name)

demo

for n in root:
   if n.tag == 'student' and n.get('name') == 'Cindy':
       exam_node = n.find('exam')
       exam_node.set("absence", "no")
       for subject in ['math', 'music']:
           p = ET.Element(subject)
           p.text = '90'
           exam_node.append(p)

if os.path.exists('new.xml'):
   os.remove('new.xml')
tree.write('new.xml', encoding='utf-8', xml_declaration=True)

结果

    <student name="Cindy">
        <birthday>2001</birthday>
        <gender>female</gender>
        <hobbies>
            <hobby>reading</hobby>
            <hobby>guitar</hobby>
        </hobbies>
        <exam absence="no">
        <math>90</math><music>90</music></exam>
    </student>

修改XML元素

demo

for n in root:
   if n.tag == 'student' and n.get('name') == 'Cindy':
       exam_node = n.find('exam')
       exam_node.set("absence", "no")
       exam_node.set("date", "2022-11-11")
       for subject in ['math', 'music']:
           p = ET.Element(subject)
           p.text = '90'
           exam_node.append(p)

hobbies_node = n.find('hobbies').findall("hobby")
       hobbies_node[0].text = 'piano'
       p = ET.Element("hobby")
       p.set("old_hobby", 'yes')
       p.text = 'reading'
       n.find('hobbies').remove(hobbies_node[1])
       n.find('hobbies').append(p)

结果

    <student name="Cindy">
        <birthday>2001</birthday>
        <gender>female</gender>
        <hobbies>
            <hobby>piano</hobby>
            <hobby old_hobby="yes">reading</hobby></hobbies>
        <exam absence="no" date="2022-11-11">
        <math>90</math><music>90</music></exam>
    </student>

来源:https://blog.csdn.net/qq_52883908/article/details/127771369

标签:Python,XML,增删改查
0
投稿

猜你喜欢

  • ORACLE分区表转换在线重定义DBMS_REDEFINITION

    2024-01-16 00:23:18
  • Scripting.Dictionary 对象

    2007-10-13 09:46:00
  • Go打包附件内容到执行文件的方法

    2024-04-27 15:32:21
  • Python网络请求模块urllib与requests使用介绍

    2021-07-21 12:23:38
  • Vue中$forceUpdate()的使用方式

    2024-06-05 09:15:53
  • Python实现图像尺寸和格式转换处理的示例详解

    2021-02-17 06:33:10
  • Python3 requests模块如何模仿浏览器及代理

    2023-04-05 06:50:44
  • 用javascript实现给出的盒子的序列是否可连为一矩型

    2023-09-09 22:34:02
  • 跟老齐学Python之用while来循环

    2021-01-13 23:38:18
  • MySQL mysqladmin客户端的使用简介

    2024-01-26 00:33:29
  • @ResponseBody 和 @RequestBody 注解的区别

    2024-04-16 09:35:00
  • Python基于opencv实现的人脸识别(适合初学者)

    2021-10-13 19:39:29
  • golang之判断元素是否在数组内问题

    2024-03-15 02:24:49
  • Python3.7下安装pyqt5的方法步骤(图文)

    2021-08-27 14:02:05
  • python3实现高效的端口扫描

    2023-07-23 12:18:06
  • 对Python 语音识别框架详解

    2023-09-22 01:32:30
  • python生成指定长度的随机数密码

    2021-01-24 23:53:17
  • Python学习之迭代器详解

    2022-09-02 12:45:45
  • SQLServer 附加数据库后出现只读或失败的解决方法

    2024-01-18 11:29:23
  • python命令行解析之parse_known_args()函数和parse_args()使用区别介绍

    2023-10-05 01:49:54
  • asp之家 网络编程 m.aspxhome.com