python xml文件解析 及生成xml文件


#解析一個database的xml文件

"""
<databaselist type="database config">
    <database>
        <host>localhost</host>
        <username>root</username>
        <password>11111</password>
        <datasename>wulaoshi</datasename>
    </database>
</databaselist>
"""

#解析xml文件
domtree=parse('d:\\pylianxi\\data.xml')

#獲取根節點
datalist=domtree.documentElement

d={}
#獲取標簽為database的子節點
database=datalist.getElementsByTagName('database')

#database的子節點輪詢,過濾掉textNode節點,取出文本值
for i in database[0].childNodes[1::2]:
    tag=i.tagName
    d[tag]=i.childNodes[0].data #childNodes 獲取的是一個列表,通過childNodes[0]獲取具體對象

print('database:',d)

 2、手動寫一個xml文件

#寫xml

from xml.dom.minidom import *

#創建一個文檔對象
doc=Document()

#創建一個根節點
root=doc.createElement('managers')

#根節點添加屬性
root.setAttribute('company','中體彩')
print(root.getAttribute('company'))

#根節點加入到tree
doc.appendChild(root)


#創建二級節點
company=doc.createElement('gloryroad')
name=doc.createElement('name')
name.appendChild(doc.createTextNode('公司名稱')) #添加文本節點

#創建一個帶着文本節點的子節點
ceo=doc.createElement('ceo')
ceo.appendChild(doc.createTextNode('吳總'))  #<ceo>吳總</ceo>

company.appendChild(name) #name加入到company
company.appendChild(ceo)
root.appendChild(company)#company加入到根節點

print(ceo.tagName)

print(doc.toxml())

#存成xml文件
fp=open('d:\\pylianxi\\test.xml','w',encoding='utf-8')
doc.writexml(fp,indent='',addindent='\t',newl='\n',encoding='utf-8')
fp.close()

 3、通過字典數據 存成xml文件

from xml.dom.minidom import Document
#在內存中創建一個空的文檔
doc = Document() 

#創建一個根節點Managers對象
root = doc.createElement('Managers') 

#設置根節點的屬性
root.setAttribute('company', '哈哈科技') 
root.setAttribute('address', '科技軟件園') 

#將根節點添加到文檔對象中
doc.appendChild(root)
 
managerList = [{'name' : 'joy',  'age' : 27, 'sex' : ''},
               {'name' : 'tom', 'age' : 30, 'sex' : ''},
               {'name' : 'ruby', 'age' : 29, 'sex' : ''}  ]

for i in managerList :
  nodeManager = doc.createElement('Manager')
  for j in i:
    
    nodeName = doc.createElement(j)
    #給葉子節點name設置一個文本節點,用於顯示文本內容
    nodeName.appendChild(doc.createTextNode(str(i[j])))
    
    #將各葉子節點添加到父節點Manager中,
    nodeManager.appendChild(nodeName)

  #最后將Manager添加到根節點Managers中
  root.appendChild(nodeManager)

#開始寫xml文檔
fp = open('d:\\pylianxi\\company11.xml', 'w',encoding='utf-8')
doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding="utf-8")
fp.close()

 4、使用etree的方式解析xml文件

#etree xml

from xml.etree import ElementTree as ET

  '''
  直接解析XML文件並獲得根節點

  tree = ET.parse(xmlFilePath)

  root = tree.getroot()
  解析字符串

  root = ET.fromstring(fp.read())
  '''

tree=ET.ElementTree(file='d:\\pylianxi\\movies.xml')

root=tree.getroot()

#打印根節點的標簽及屬性字典
print(root.tag)
print(root.attrib)

#獲取子節點movie的標簽及屬性字典
for i in root:
    print (i.tag)
    print ("********", i.attrib)

print ("*"*50)
print (root[0].tag)
print (root[0].text)  #“打印的內容為一個回車”
print (root[0][0].tag) #第一個movie節點的第一個子標簽type
print (root[0][0].text)

print ("*"*50)
for i in tree.iter():  #遞歸遍歷所有子元素
    print (i.tag, i.attrib,i.text)

print ("*"*50)
for elem in tree.iterfind('movie/type'):#或者這種方式./movie/type查找movie下一級節點中的所有type標簽,類似xpath查找
    print (elem.tag, elem.text)

print ("*"*50)
print(list(tree.iter(tag='stars')))
for elem in tree.iter(tag='stars'):#在整個樹中查找標簽為stars的元素
    print (elem.tag, elem.text)


print ("*"*50)
for elem in tree.iterfind('*[@title="Ishtar"]'): #或者movie[@title="Ishtar"] 在下一級節點查找屬性為title="Ishtar"的元素
    print (elem.tag, elem.attrib)

print ("-"*50)
root = tree.getroot()                #獲取第一級movie元素
print ("root:",root[0].tag  )          #打印第一級movie元素的標簽,為movie
print ("subnode:",root[0][0].tag)      #打印第一級movie元素下的第一個子元素標簽type
print ("subnode:",root[0][1].tag )     #打印第一級movie元素下的第二個子元素標簽format
print ("subnode:",root[0][2].tag )     #打印第一級movie元素下的第三個子元素標簽year
print ("subnode:",root[0][3].tag )     #打印第一級movie元素下的第四個子元素標簽rating
print ("subnode:",root[0][4].tag ) 

del root[0][4] #刪除第一級movie元素下的第五個子元素
del root[0][3] #刪除第一級movie元素下的第四個子元素
del root[0][2] #刪除第一級movie元素下的第三個子元素
del root[0][1] #刪除第一級movie元素下的第二個子元素

del root[3] #刪除第四個movie元素
del root[2] #刪除第三個movie元素

for i in root:
    print(i.tag,i.attrib)
    for j in i:
        print('******',j.tag,j.text)
#tree.write("d:\\movies.xml")  #將變更的xml文件寫入到文件中

5、etree的方式生成xml

 

#etree 生成一個xml

a = ET.Element('elem')            #生成一個節點elem,沒有文本節點
aa = ET.SubElement(a, 'type')    #生成一個字節點下的子節點child1
aa.text = "a的type子節點"              #在子節點上添加文本節點
aa2 = ET.SubElement(a, 'name')    #生成一個字節點下的子節點child2
aa2.text='a的name子節點'

b = ET.Element('elem_b')          #生成一個節點elem_b,沒有文本節點
b.set('company','科技公司')
bb=ET.SubElement(b,'type')
bb.text='bb的type子節點'
bb2=ET.SubElement(b,'name')
bb2.text='bb的name子節點'

root = ET.Element('root')         #生成一個節點root
root.extend((a, b))               #將a、b兩個變量存儲的節點elem和elem1添加到root節點下
tree = ET.ElementTree(root)       #生成節點樹
root[0].set('foo', 'bar')         #設定第一個子元素的屬性foo,值為bar


tree.write("d:\\pylianxi\\test.xml",encoding='utf-8')        #將xml文件內容寫入到文本文件中,文件格式並不是很漂亮

 


免責聲明!

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



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