python xml文件处理

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>
View Code

获取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:每个节点的缩进字符

原文地址:https://www.cnblogs.com/xia-dong/p/11736713.html