Overview
这篇博客内容将包括对XML文件的解析、追加新元素后写入到XML,以及更新原XML文件中某结点的值。使用的是python的xml.dom.minidom包,详情可见其官方文档:xml.dom.minidom官方文档。全文都将围绕以下的customer.xml进行操作:
<"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()
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()
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文件内容并完成修改
我就废话不多说了,还是直接看代码吧!
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文件方式(解析、更新、写入)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]