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 Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
python实现合并两个排序的链表
Mar 03 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
基于python实现可视化生成二维码工具
Jul 08 Python
使用Python实现音频双通道分离
Dec 25 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
探讨方法的重写(覆载)详解
2013/06/08 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
php实现递归的三种基本方式
2020/07/04 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
python pyheatmap包绘制热力图
2018/11/09 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
python实现3D地图可视化
2020/03/25 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
七一建党日演讲稿
2014/09/05 职场文书
小型婚礼主持词
2015/06/30 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
各国货币符号大全
2022/02/17 杂记
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS