使用python对xml文件进行批处理,统一修改xml文件里的path标签。
由于笔者对python不是很熟,中间遇到了很多问题,在这里把经验分享给大家。
主要参考的博客是https://blog.csdn.net/yourgreatfather/article/details/83996031,非常感谢这位博主,给了我很多启发。
1.什么是xml文件?
XML 指可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据。XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。
2.使用python如何对xml进行处理?
常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。
Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:
(1)SAX (simple API for XML )
Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
(2)DOM(Document Object Model)
将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。
(3)ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
笔者在脚本中使用的就是DOM包。
DOM:文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
实际上笔者使用的只是xml.dom.minidom,它是文档对象模型接口的最小实现,具有与其他语言类似的API,在比完整的DOM更简单,并且也明显更小。
在这里我贴出代码,配合注释进行一下梳理。
这是python代码
import os
import os.path
import xml.dom.minidom
#导包,没什么可说的
filepath="./"
files=os.listdir(filepath) #得到文件夹下所有文件名称
#要确定一下xml文件的路径
for xmlFile in files: #遍历文件夹
if not os.path.isdir(xmlFile): #判断是否是文件夹,不是文件夹才打开
print(xmlFile) #输出xml文件名
dom=xml.dom.minidom.parse(os.path.join(filepath,xmlFile))
#这行代码比较关键,parse用于打开xml文件,但是在这里不能直接传入文件名,否则会报错
#这里是把路径和xml文件名做了一个拼接,这样就没问题
root=dom.documentElement #获得xml文件里的所有节点信息
path=root.getElementsByTagName('path') #通过标签名得到标签里的内容,这里是获得了文件里的path,即<path>C:/xxx/0.jpg</path>
###原始信息
print('原始信息')
path0 = path[0] #getElementsByTagName()返回带有指定名称的所有元素的 NodeList,因此要通过下标获取指定的path,这里是0,因为只有一个
print (path0.firstChild.data) #这是指定节点的第一个子节点的原始数据(未修改)
filename=xmlFile.split('.')
path0.firstChild.data='/xxxxx/data/Img/'+filename[0]+'.jpg'#这两行代码应该不难理解,就是获取路径并进行更新
#打印输出(修改后)
print(path0.firstChild.data)
print ('##################')
with open(os.path.join(filepath,xmlFile),'w',encoding='UTF-8') as fh:
#使用open函数写入xml文件,要注意后面两个参数,标识符'w'表示写入文本文件,一定要指定编码格式,否则会出现乱码和bug!
dom.writexml(fh)
#一个xml文件更改完毕