xml 文件:
<Maple> <Job Name="Job.xml"> <Parameters> <Parameter Type="Single" Visible="True" ReadOnly="True" Name="Type" Value="Execution" /> <Parameter Type="Single" Visible="True" ReadOnly="True" Name="Version" Value="1.1.2" /> </Parameters> <Images> <Image Name="" Location=""> <Workloads Version=""> <Workload Name="streamServer" Location="C:SVSHAREMapleBinWorkloadsstreamServer"> <Parameters> <Parameter Type="Single" Visible="True" ReadOnly="False" Name="threads" Value="56" /> <Parameter Type="Single" Visible="True" ReadOnly="False" Name="RetriesOnError" Value="1" /> <Parameters Type="Multiple" Visible="True" ReadOnly="False" Name="OS" Value="posix" /> <Values> <Value>win</Value> <Value>posix</Value> </Values> </Parameters> </Workload> </Workloads> </Image> </Images> </Job> </Maple>
获取root节点的三种方式
import xml.etree.ElementTree as xmlDoc
root=xmlDoc.parse('test.xml')._root #_root同getroot()
root=xmlDoc.ElementTree(file='test.xml').getroot()
root=xmlDoc.fromstring(open('test.xml').read())
遍历查找
for child in root:
print child.tag
for children in child:
print children.tag
直接索引访问
root[0][1][0][0][0][0][3][0].text
root[0][0][0].get('Type')
find 查找,只匹配第一个
root.find('Job').attrib #在直接子节点中查找Job直接子节点
root.find("Job/Parameters/Parameter").attrib['Value'] #查找Job/Parameters/Parameter下的所有直接子节点,并返回第一个直接子节点
root.find("Job/Parameters/Parameter[@Name='Maple Version' and Type='Single']").attrib['Value'] #查找Job/Parameters/Parameter下的所有直接子节点,并返回Name="Maple Versino"这个直接子节点
#findall 查找,匹配所有的,返回数组
root.findall('Job')[0].tag #在直接子节点中查找Job直接子节点,返回数组
root.findall('Job/Parameters/Parameter')[1].attrib['Name'] #返回Job/Parameters/Parameter下的所有直接子节点的数组
root.findall("Job/Parameters/Parameter[@Name='Type']") #返回Job/Parameters/Parameter下 Name='Type'的直接子节点的数组
#iter 查找
for i in root.iter('Value'): #在文件中查找Value的节点,生成器
print i.text
##修改Text
import xml.etree.ElementTree as xmlDoc
tree=xmlDoc.parse('test.xml')
root=tree.getroot()
for i in root.iter('Value'):
if i.text == 'win':
i.text = 'Linux'
print xmlDoc.dump(root) #预览
tree.write('a.xml',encoding='utf-8') #保存
#修改属性
root[0].get('Name') 获取属性
root[0].set('Name','aaa') 更新,添加属性
del root.attrib['Type'] 删除属性
#删除节点
root.remove(root[0])
tree.write('a.xml',encoding='utf-8')
#添加节点
import xml.etree.ElementTree as xmlDoc
tree=xmlDoc.parse('a.xml')
root=tree.getroot()
node_1=xmlDoc.Element('Maple',{'Value':'Node1'}) #新建一个节点
node_1.tail='
' #缩进
node_2=xmlDoc.SubElement(node_1,'Job') #新建一个子节点
node_2.set('Value','100')
node_2.text='10'
root.insert(1,node_1) #append
root.append(node_1) #insert
node_3=xmlDoc.Element('Task1')
node_4=xmlDoc.Element('Task2')
root.extend([node_3,node_4]) #extend
xmlDoc.dump(root) #预览
tree.write('b.text',encoding='utf-8') #保存,可以保存到b.text 或者b.html或者b.xml
**使用xml.etree.ElementTree 创建节点保存时,没有缩进,不太美观,所以采用xml.dom来创建节点并保存
from xml.dom import minidom
file=minidom.Document() #创建xml文件对象
node_1=file.createElement('root') #创建节点
file.appendChild(node_1) #使其成为根节点
node_2=file.createElement('Maple') #创建第二个节点
node_2.setAttribute('TestName','aaa') #设置attrib
node_3=file.createElement('Job') #创建第三个节点
node_3.setAttribute('Jobname','job') #设置attrib
node_3.appendChild(file.createTextNode('100')) #设置Text
node_2.appendChild(node_3)
node_1.appendChild(node_2)
with open('b.xml','w') as f:
file.writexml(f,indent='',addindent=' ',newl='
',encoding='UTF-8')
indent:每个tag前填充字符
newl:每个tag后的填充字符
addindent:每个节点的缩进字符