网络编程
位置:首页>> 网络编程>> Python编程>> python解析xml文件方式(解析、更新、写入)

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

作者:Liu Zhian  发布时间:2022-03-07 05:19:01 

标签:python,xml文件

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)

来源:https://blog.csdn.net/qq_37174526/article/details/89489212

0
投稿

猜你喜欢

  • 前言上一次简单了解了协程的工作原理 前文链接最后提到了几个使用协程时会遇到的问题,其中一个就是主线程不会等待子线程结束,在这里记录两种比较简
  • 因为写js经常需要用到访问样式,我们常用的做法是通过 DOM.style.XXX来读写样式信息的。可是DOM.style这种写法只能访问&l
  • 以前写过一个标签效果,外观虽然好看,但代码不太规范,实现的方法比较繁冗。需要注意的是标签的背景图,两种状态,激活的标签背景为蓝色,反之为灰色
  • 导语:排版是一门艺术,也是一门技巧。我们每天都能在报纸,书籍等各种媒介上看到排版,或精美,或丑陋。如何能在准确传递信息的同时,又能排出精美的
  • 这几天有一台MySQL数据库服务器出现了频繁的掉线情况,通过排查,并没有排查出哪个网站被攻击,百思不得其解中的时候,群里有个朋友说是因为微软
  • 问题:我们每天都要编写一些Python程序,或者用来处理一些文本,或者是做一些系统管理工作。程序写好后,只需要敲下python命令,便可将程
  • 本文实例讲述了python使用opencv实现马赛克效果。分享给大家供大家参考,具体如下:最近要实现opencv视频打马赛克,在网上找了一下
  • 先看几个数据。。一大堆文字滴,不管人家是不是故意的,字数还是这样:news.163.cn:14px,39个中文字符 news.sina.co
  • 如下代码,限制某个函数在某个时间段的调用次数,灵感来源:python装饰器-限制函数调用次数的方法(10s调用一次) 欢迎访问原博客中指定的
  • 去除HTML代码中所有标签<% '****************************** '函数:RemoveH
  • 我们在日常开发中,我们经常会面对复杂的子系统,其中包含许多相互关联的类和接口。直接使用这些类和接口可能会导致代码的复杂性增加,使得系统难以维
  • 一、控制用户存取 1、创建修改用户Creating Users Create/alter user new_user identified
  • 将来电脑的大显示屏会越来越普及,并且从现在web设计作品中能观察到两点趋势:页面布局普遍更宽;页面内容文字普遍更大。使用1280×800和1
  • 最近发现一常见的加载进度条(loadding)的问题,所以试试,觉得还不错,大家可以看下.当然这个只是一个效果而已!呵呵,用的着的时候,你就
  • 如果遇到与文件许可有关的问题,可能数启动mysqld时UMASK环境变量设置得不正确。例如,当你创建表时,MySQL可能会发出下述错误消息:
  • 本文实例分析了JavaScript事件委托技术。分享给大家供大家参考。具体分析如下:如果一个整体页面里有大量的按钮.我们就要为每一个按钮绑定
  • 由于新云CMS系统,网站底部“版权信息”字段在数据库中是“文本”类型,有250个字符的限制。想在这里给加网站统计代码,因为字数限制的原因,就
  • 只要把下面代码放到index.asp或者default.asp中,只要在首页代码顶部引用call Check_Wap(),这个也是我的工程中
  • <body oncontextmenu="return false" onselectstart="re
  • 细线边框是网页中定位区分内容常用的一种方法,配合特定图片的使用,往往能够达到不错的效果,那么如何制作细线边框呢?asp之家注:现在要实现这个
手机版 网络编程 asp之家 www.aspxhome.com