写在之前
大家好,这是首发在我公众号「Python空间」的第 72 篇文章,欢迎关注,期待和你的交流。
隔了两天了,不知道你们还记得上一篇文章的内容不,如果不记得的话请移步 -- Python 标准库之 XML(上)。
今天我们继续来学习 XML 的剩下的内容,主要是编辑和一些常用属性和方法的总结,下面开始今天的学习。
编辑(增删改查)
我们还是用上一篇文章中的例子,为了方便查看,我把内容再粘贴过来,下面的内容记得保存并且命名为 test.xml。
Everyday ItalianGiada De Laurentiis
2005
30.00
Harry PotterJ K. Rowling
2005
29.99
Learning XMLErik T. Ray
2003
39.95
上一篇文章我们主要是对 xml 进行了读取的有关操作,其实还可以对 XML 进行编辑,也就是增删改查的功能,下面我们来操作一下:
>>> import xml.etree.ElementTree as ET
>>> tree = ET.ElementTree(file = "test.xml")
>>> root = tree.getroot() #获得根
>>> root[1].tag
'book'
>>> del root[1]
>>> for ele in root:
... print(ele.tag)
...
book
book
如上,我们成功的删除了一个节点,原来有 3 个 book 节点,现在就只剩下两个了。接下来让我们打开源文件看看,是不是正好缺少了第 2 个节点呢?结果让我们很失望,源文件并没有什么变化。
确实如此,源文件并没有变,因为到了这一步的修改动作还只是停留在内存里,还没有将修改的结果输出到文件,不要忘记我们是在内存中建立的 ElementTree 对象。那么该如何做呢?请接着往下看:
>>> import os
>>> outpath = os.getcwd()
>>> file = outpath + "/test.xml"
把当前文件的路径拼装好。
>>> tree.write(file)
做完上面的操作以后再去看源文件,已经变成两个节点了。
除了删除,也是可以修改的:
>>> for price in root.iter('price'): #原来每本书的价格
... print(price.text)
...
30.00
39.95
>>> for price in root.iter('price'): #每本上涨 10 元并做标记
... new_price = float(price.text) + 10
... price.text = str(new_price)
... price.set("updated","up")
...
>>> tree.write(file)
然后我们来查看一下源文件:
Everyday ItalianGiada De Laurentiis
2005
50.0
Learning XMLErik T. Ray
2003
49.95
通过对比我们可以发现,不仅价格改变了,而且在 price 标签里面增加了属性标记。
上面我们是用 del 来删除某个元素,其实这个在编程中我们用的并不多,一般情况下更喜欢用 remove() 方法。比如要删除 price = 50 的书,可以像下面这样操作:
>>> tree.write(file)
>>> for book in root.findall("book"):
... price = book.find("price").text
... if float(price) == 50:
... root.remove(book)
...
>>> tree.write(file)
于是就有了下面的结果:
Learning XMLErik T. Ray
2003
49.95
接下来我们来看看增加元素:
>>> import xml.etree.ElementTree as ET
>>> tree = ET.ElementTree(file = 'test.xml')
>>> root = tree.getroot()
>>> ET.SubElement(root,"book") # 在root里面添加book节点
>>> for ele in root:
... print(ele.tag)
...
book
book
>>> b2 = root[1]
>>> b2.text = 'python'
>>> tree.write('test.xml')
这样就大功告成了,然后再像上面一样看一下源文件,发现果真增加了。
常用的属性 & 方法
ET 里面的属性 & 方法很多,这里列出常用的几个,供使用中备查。
1.Element 对象
常用的属性如下:
tag:string,元素数据种类
text:string,元素的内容
attrib:dictionary,元素的属性字典
tail:string,元素的尾形
针对属性的操作如下:
clear():清空元素的后代,属性,text 和 tail 也设置为 None。
items():根据属性字典返回一个列表,列表元素为(key,value)。
keys():返回包含所有元素属性键的列表。
set(key,value):设置新的属性键和值。
针对后代的操作如下:
append(subelement):添加直系子元素。
extend(sunelements):增加一串元素对象作为子元素。
find(match):寻找第一个匹配子元素,匹配对象可以为 tag 或 path。
findall(match):寻找所有匹配子元素,匹配对象可以为 tag 或 path。
insert(index,element):在指定位置插入子元素。
remove(subelement):删除子元素
2.ElementTree 对象
find(match)。
findall(match)。
getroot():获取根结点。
parse(source,parser = None):装载 XML 对象,source 可以为文件名或文件类型对象。
写在之后
Python 标准库之 XML 的基本知识大体我就说这么多,至于明天推送什么我还没想好,有读者在后台说这个能不能弄几个题实战一下,我看看能不能找到什么能练的题,要是找到的话明天就写一下,要是找不到的合适的话就先放一下,以后想几个再更。
不知道大家伙有没有看我昨天的文章,推荐的几个号,确实不错,没看的话可以找着再看看,真的很不错。
如果你觉得本篇文章对你有所帮助的话,点个赞再走呀,谢谢。
The end。