python解析xml文件方式(解析、更新、写入)


Posted in Python onMarch 05, 2020

Overview

这篇博客内容将包括对XML文件的解析、追加新元素后写入到XML,以及更新原XML文件中某结点的值。使用的是python的xml.dom.minidom包,详情可见其官方文档:xml.dom.minidom官方文档。全文都将围绕以下的customer.xml进行操作:

<?xml version="1.0" encoding="utf-8" ?>
<!-- This is list of customers -->
<customers>
 <customer ID="C001">
  <name>Acme Inc.</name>
  <phone>12345</phone>
  <comments>
   <![CDATA[Regular customer since 1995]]>
  </comments>
 </customer>
 <customer ID="C002">
  <name>Star Wars Inc.</name>
  <phone>23456</phone>
  <comments>
   <![CDATA[A small but healthy company.]]>
  </comments>
 </customer>
</customers>

CDATA:在XML中,不会被解析器解析的部分数据。

声明:在本文中,结点和节点被视为了同一个概念,你可以在全文的任何地方替换它,我个人感觉区别不是很大,当然,你也可以看做是我的打字输入错误。

1. 解析XML文件

在解析XML时,所有的文本都是储存在文本节点中的,且该文本节点被视为元素结点的子结点,例如:2005,元素节点 ,拥有一个值为 “2005” 的文本节点,“2005” 不是 元素的值,最常用的方法就是getElementsByTagName()方法了,获取到结点后再进一步根据文档结构解析即可。

具体的理论就不过多描述,配合上述XML文件和下面的代码,你将清楚的看到操作方法,下面的代码执行的工作是将所有的结点名称以及结点信息输出一下:

# -*- coding: utf-8 -*-
"""
  @Author : LiuZhian
  @Time  : 2019/4/24 0024 上午 9:19
  @Comment : 
"""
from xml.dom.minidom import parse
def readXML():
 domTree = parse("./customer.xml")
 # 文档根元素
 rootNode = domTree.documentElement
 print(rootNode.nodeName)

 # 所有顾客
 customers = rootNode.getElementsByTagName("customer")
 print("****所有顾客信息****")
 for customer in customers:
 if customer.hasAttribute("ID"):
  print("ID:", customer.getAttribute("ID"))
  # name 元素
  name = customer.getElementsByTagName("name")[0]
  print(name.nodeName, ":", name.childNodes[0].data)
  # phone 元素
  phone = customer.getElementsByTagName("phone")[0]
  print(phone.nodeName, ":", phone.childNodes[0].data)
  # comments 元素
  comments = customer.getElementsByTagName("comments")[0]
  print(comments.nodeName, ":", comments.childNodes[0].data)

if __name__ == '__main__':
 readXML()

python解析xml文件方式(解析、更新、写入)

2. 写入XML文件

在写入时,我觉得可分为两种方式:

新建一个全新的XML文件

在已有XML文件基础上追加一些元素信息

至于以上两种情况,其实创建元素结点的方法类似,你必须要做的都是先创建/得到一个DOM对象,再在DOM基础上创建new一个新的结点。

如果是第一种情况,你可以通过dom=minidom.Document()来创建;如果是第二种情况,直接可以通过解析已有XML文件来得到dom对象,例如dom = parse("./customer.xml")

在具体创建元素/文本结点时,你大致会写出像以下这样的“四部曲”代码:

①创建一个新元素结点createElement()

②创建一个文本节点createTextNode()

③将文本节点挂载元素结点上

④将元素结点挂载到其父元素上。

现在,我需要新建一个customer节点,信息如下:

<customer ID="C003">
  <name>kavin</name>
  <phone>32467</phone>
  <comments>
   <![CDATA[A small but healthy company.]]>
  </comments>
 </customer>

代码如下:

def writeXML():
 domTree = parse("./customer.xml")
 # 文档根元素
 rootNode = domTree.documentElement

 # 新建一个customer节点
 customer_node = domTree.createElement("customer")
 customer_node.setAttribute("ID", "C003")

 # 创建name节点,并设置textValue
 name_node = domTree.createElement("name")
 name_text_value = domTree.createTextNode("kavin")
 name_node.appendChild(name_text_value) # 把文本节点挂到name_node节点
 customer_node.appendChild(name_node)

 # 创建phone节点,并设置textValue
 phone_node = domTree.createElement("phone")
 phone_text_value = domTree.createTextNode("32467")
 phone_node.appendChild(phone_text_value) # 把文本节点挂到name_node节点
 customer_node.appendChild(phone_node)

 # 创建comments节点,这里是CDATA
 comments_node = domTree.createElement("comments")
 cdata_text_value = domTree.createCDATASection("A small but healthy company.")
 comments_node.appendChild(cdata_text_value)
 customer_node.appendChild(comments_node)

 rootNode.appendChild(customer_node)

 with open('added_customer.xml', 'w') as f:
 # 缩进 - 换行 - 编码
 domTree.writexml(f, addindent=' ', encoding='utf-8')

if __name__ == '__main__':
 writeXML()

python解析xml文件方式(解析、更新、写入)

3. 更新XML文件

在更新XML时,只需先找到对应的元素结点,然后将其下的文本结点或属性取值更新即可,然后保存到文件,具体我就不多说了,代码中我将思路都注释清楚了,如下:

def updateXML():
 domTree = parse("./customer.xml")
 # 文档根元素
 rootNode = domTree.documentElement

 names = rootNode.getElementsByTagName("name")
 for name in names:
 if name.childNodes[0].data == "Acme Inc.":
  # 获取到name节点的父节点
  pn = name.parentNode
  # 父节点的phone节点,其实也就是name的兄弟节点
  # 可能有sibNode方法,我没试过,大家可以google一下
  phone = pn.getElementsByTagName("phone")[0]
  # 更新phone的取值
  phone.childNodes[0].data = 99999

 with open('updated_customer.xml', 'w') as f:
 # 缩进 - 换行 - 编码
 domTree.writexml(f, addindent=' ', encoding='utf-8')

if __name__ == '__main__':
 updateXML()

python解析xml文件方式(解析、更新、写入)

如有不对之处,还烦请指教~

补充知识:python 读取xml文件内容并完成修改

我就废话不多说了,还是直接看代码吧!

import os
import xml.etree.ElementTree as ET


def changesku(inputpath):
  listdir = os.listdir(inputpath)
  for file in listdir:
    if file.endswith('xml'):
      file = os.path.join(inputpath,file)
      tree = ET.parse(file)
      root = tree.getroot()
      for object1 in root.findall('object'):   #我要修改的元素在object里面,所以需要先找到object
        for sku in object1.findall('name'):  #查找想要修改的所有同种元素
          if (sku.text == '005'):         #‘005'为原始的text
            sku.text = '008'           #修改‘name'的标签值
            tree.write(file,encoding='utf-8')   #写进原始的xml文件,不然修改就无效,‘encoding = “utf - 8”'避免原始xml                                           #中文字符乱码

          else:
            pass                  
    else:
      pass

if __name__ == '__main__':
  
  inputpath = 'D:\\easy\\hebing_xml'     #这是xml文件的文件夹的绝对地址
  changesku(inputpath)

以上这篇python解析xml文件方式(解析、更新、写入)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅述python中argsort()函数的实例用法
Mar 30 Python
python计算列表内各元素的个数实例
Jun 29 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
python实现数据分析与建模
Jul 11 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
Python连接字符串过程详解
Jan 06 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 Python
Django drf请求模块源码解析
Jun 08 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 #Python
python批量替换文件名中的共同字符实例
Mar 05 #Python
python批量修改xml属性的实现方式
Mar 05 #Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 #Python
Python实现在Windows平台修改文件属性
Mar 05 #Python
Pycharm最常用的快捷键及使用技巧
Mar 05 #Python
Python 去除字符串中指定字符串
Mar 05 #Python
You might like
php 批量替换html标签的实例代码
2013/11/26 PHP
php之readdir函数用法实例
2014/11/13 PHP
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
js放大镜放大购物图片效果
2017/01/18 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
Vue-component全局注册实例
2018/09/06 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
Python 列表(List)操作方法详解
2014/03/11 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
Overload和Override的区别
2012/09/02 面试题
介绍下static、final、abstract区别
2015/01/30 面试题
感情真挚的毕业生求职信
2014/07/19 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
员工教育培训协议书
2014/09/27 职场文书
音乐剧猫观后感
2015/06/04 职场文书
研讨会致辞
2015/07/31 职场文书