pytorch技巧 三: 解析XML文件 及 ElementTree模块的使用
1. 理解什么是xml
xml是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分。您可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。
下面为一个xml文件,后续对xml文件的操作都用这个例子来演示。
为了很好的理解xml文件的结构,画了树状图来表示,其中树状图的层数在xml文件中是空格来表示,即越深的节点空格数越多,对比就可以发现xml文件的特点。其中叶子节点表示该节点没有子节点。
2. 利用ElementTree解析xml
第一步,将xml文件解析为树:
import xml.etree.ElementTree as ET
##下面是两种解析方法,看了源码,这两种方法效果其实是一样的,使用的时候看哪种方便就用哪种
tree1 = ET.ElementTree(file='./dlj.xml')
tree2 = ET.parse('./dlj.xml')
后面就可以对树进行各种操作:
- 获取根节点
import xml.etree.ElementTree as ET
tree = ET.parse('./dlj.xml')
root = tree.getroot() #<Element 'annotation' at 0x000001EF52528868>
显示根节点是个Element对象,名称为’annotation’
- 遍历子节点
import xml.etree.ElementTree as ET
tree = ET.parse('./dlj.xml')
root = tree.getroot()
for item in root.iter():
print(item.tag) #显示节点名称
print(item.text) #显示节点内容
- 查找特定节点
import xml.etree.ElementTree as ET
tree = ET.parse('./dlj.xml')
root = tree.getroot()
for item in root.iter('xmin'): # 查找指定节点'xmin'
print(item.text) # 131
上面方法是遍历所有节点,找特定节点。
还有一种方法是遍历其直接子节点,找特定节点,如下所示:(如果其直接节点没有所找的特定节点会报错)
import xml.etree.ElementTree as ET
tree = ET.parse('./dlj.xml')
root = tree.getroot()
item1 = root.find('object') #在根节点下查找直接子节点'object'
print(item1.tag)
item2 = item1.find('difficult') #在节点'object'下查找直接子节点'difficult'
print(item2.tag)
print(item2.text)
其实还可以通过索引来访问节点。
- 删除节点
import xml.etree.ElementTree as ET
tree = ET.parse('./dlj.xml')
root = tree.getroot()
del root[3] # 删除根节点下索引为3的直接子节点,由结果可知节点'object'及其所有子节点都删除了。
for item in root.iter():
print(item.tag)
print(item.text)
- 更改节点名称或内容
import xml.etree.ElementTree as ET
tree = ET.parse('./dlj.xml')
root = tree.getroot()
root.find('folder').text = 'dlj' # 更改节点内容
root.find('folder').tag = 'wzh' # 更改节点名称
for item in root.iter():
print(item.tag)
print(item.text)
- 保存xml文件
注意!!!上面对xml文件的更改操作不会改变原本的xml文件,必须要保存下来。
import xml.etree.ElementTree as ET
tree = ET.parse('./dlj.xml')
root = tree.getroot()
root.find('folder').text = 'dlj'
root.find('folder').tag = 'wzh'
modify_tree = ET.ElementTree(root)
path_xml = 'new.xml'
modify_tree.write(path_xml)
在工程文件夹下就会生成一个new.xml的文件,如下所示,可以看出改动已经保存下来了。