前言
因为课题要用到创建和解析xml文件,所以简单自学了一下ElementTree这个库,由于本人是第一次接触这个库,所以只能以新手的角度进行解释,如果你也是新手,希望以新手的角度来理解的话可以跟着我的文章一起学习😀。Python 的 ElementTree
是一个用于解析和创建 XML 数据的模块。它包含两个类:ElementTree
(代表整个XML文档)和 Element
(代表XML中的单个节点)
一、xml文件结构简介
学过html的话可以忽略这部分内容,没学过我就简单介绍下
这张图里<>符号里的PostProcessing我们称为Tag也就是标签
type = “xxxx”我们称为attrib也就是属性,404和1446是在两个<>之间的内容,我们称为txt,也就是文本,大概的结构可以看下面这个伪代码
<Tag attrib = ' '>txt</Tag>
二、xml文件的读取
一般导包这么导
import xml.etree.ElementTree as ET
假设你有一个名为example.xml的文件,你可以用下面的代码来读取它,如果没有,你可以先看第三章学习创建一个xml文档。
tree = ET.parse('example.xml')
root = tree.getroot()
现在,root变量就包含了整个xml文件的根元素,我们后续可以之间操作root变量。
三、创建xml文件
如果你没有xml文件,那么可以先创建一个
# 创建根元素
root = ET.Element("root")
# 创建子元素
child = ET.SubElement(root, "child")
child.text = "This is a test"
# 创建子元素并添加属性
child_with_attrib = ET.SubElement(root, "child_with_attrib")
child_with_attrib.set("name", "value")
# 创建 ElementTree 对象并保存为 XML 文件
tree = ET.ElementTree(root)
tree.write("new_example.xml")
现在你可以写一个实例来测试一下,比如本文的第一张图就是由以下代码创建的(只是我个人的实例,新手学习的话建议用上面的代码块试一下)。
# 单张影像调窗操作,生成xml文件
import pydicom
import xml.etree.ElementTree as ET
# DICOM文件地址和输出的xml文件地址
input_dicom_file = "E:/competition/Graduate Project/CT/8003806910很好/FILE0.dcm"
output_xml_file = "E:/competition/Graduate Project/TEST/window adjustment/FILE0-a.xml"
# 读取DICOM文件
ds = pydicom.dcmread(input_dicom_file)
# 窗宽窗位调整数值设置
window_width = 404
window_level = 1446
# 创建XML文件来记录后处理操作
root = ET.Element("PostProcessing")
root.set("version", "1.0")
operation = ET.SubElement(root, "Operation")
operation.set("type", "WindowLevelAdjustment")
ET.SubElement(operation, "WindowWidth").text = str(window_width)
ET.SubElement(operation, "WindowLevel").text = str(window_center)
# 保存XML文件
tree = ET.ElementTree(root)
tree.write(output_xml_file)
print(f"Post processing steps saved to XML: {output_xml_file}")
这段代码里的创建XML文件里,PostProcessing是我创建的根节点,Operation是我创建的子节点,而windowwidth和windowlevel又是operation的子节点,我现在把本文的第一张图再放在这里就可以很好理解根节点和子节点了。
四、遍历xml文件
我们可以通过遍历根元素,来遍历整个文档
for child in root:
print(child.tag, child.attrib)
五、修改xml文件
如果我们要修改某个节点的attrib,可以用set,比如我现在修改root节点
root.set('name','value')
那么root节点就会变成
<root name = "value">.......省略.......</root>
如果我们要修改txt的值,比如我上面的代码,可以用.text来修改
ET.SubElement(operation, "WindowLevel").text = str(window_center)
六、删除元素
for elem in root.findall('branch'):
root.remove(elem)
# 保存更改
tree.write('modified_example.xml')