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函数中的默认参数
Mar 30 Python
Python中super的用法实例
May 28 Python
Python实现线程池代码分享
Jun 21 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
详解Python中的动态属性和特性
Apr 07 Python
PyQT实现多窗口切换
Apr 20 Python
python实现Flappy Bird源码
Dec 24 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
Django中使用Json返回数据的实现方法
Jun 03 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 Python
python随机打印成绩排名表
Jun 23 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中Smarty模板初体验
2011/08/08 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
python版飞机大战代码分享
2018/11/20 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
酒店端午节促销方案
2014/02/18 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
超市收银员岗位职责
2015/04/07 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
python 安全地删除列表元素的方法
2022/03/16 Python