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:\SVSHARE\Maple\Bin\Workloads\streamServer">
            <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='\n' #縮進

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='\t',newl='\n',encoding='UTF-8')

indent:每個tag前填充字符
newl:每個tag后的填充字符
addindent:每個節點的縮進字符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM