作者:Rocky0249


写在之前


隔了1天了,不知道你们还记得上一篇文章的内容不,如果不记得的话请移步 -- Python 标准库之 XML(上)


今天我们继续来学习 XML 的剩下的内容,主要是编辑和一些常用属性和方法的总结,下面开始今天的学习。


编辑(增删改查)


我们还是用上一篇文章中的例子,为了方便查看,我把内容再粘贴过来,下面的内容记得保存并且命名为 test.xml。


<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title> 
<author>Giada De Laurentiis</author> 
<year>2005</year> 
<price>30.00</price> 
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title> 
<author>J K. Rowling</author> 
<year>2005</year> 
<price>29.99</price> 
</book>
<book category="WEB">
<title lang="en">Learning XML</title> 
<author>Erik T. Ray</author> 
<year>2003</year> 
<price>39.95</price> 
</book>
</bookstore>


上一篇文章我们主要是对 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)


然后我们来查看一下源文件:


<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price updated="up">50.0</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price updated="up">49.95</price> 
</book>
</bookstore>


通过对比我们可以发现,不仅价格改变了,而且在 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)


于是就有了下面的结果:


<bookstore>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price updated="up">49.95</price> 
</book>
</bookstore>


接下来我们来看看增加元素:


>>> import xml.etree.ElementTree as ET
>>> tree = ET.ElementTree(file = 'test.xml')
>>> root = tree.getroot()
>>> ET.SubElement(root,"book") # 在root里面添加book节点
<Element 'book' at 0x000000000209C778>
>>> 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 可以为文件名或文件类型对象。