Python格式化文件存儲---XML

      網(wǎng)友投稿 1007 2025-04-01

      結構化文件存儲


      xml, json

      為了解決不同設備之間信息交換

      xml

      json

      XML文件

      參考資料

      https://docs.python.org/3/library/xml.etree.elementtree.html

      http://www.runoob.com/python/python-xml.html

      https://blog.csdn.net/seetheworld518/article/details/49535285

      XML(eXtensibleMarkupLanguage), 可擴展標記語言

      標記語言:語言中使用尖括號括起來的文本字符串標記

      可擴展:用戶可以定義自己需要的標記

      例如:

      自定義標記Teacher 在兩個標記之間任何內(nèi)容都應該跟Teacher相關

      exam.xml

      math>80 ruo 18 ruo 18 ruo 18

      是w3c組織制定的一個標準

      XML描述的數(shù)據(jù)本身,即數(shù)據(jù)的結構和定義

      HTML側重于如何顯示web頁面中的數(shù)據(jù)

      XML文檔的構成

      處理命令(可以認為一個文件內(nèi)只有一個處理命令)

      最多只有一行

      且必須在第一行

      內(nèi)容是與xml本身處理起相關的一些聲明或者指令

      以xml關鍵字開頭

      一般用于聲明XML的版本和采用的編碼

      version屬性是必須的

      encoding屬性用來支出xml解釋器使用的編碼

      Python格式化文件存儲---XML

      根元素(一個文件內(nèi)只有一個根元素)

      在整個xml文件中,可以把他看做一個樹形結構

      根元素有且只能有一個

      子元素

      屬性

      內(nèi)容

      表明標簽所存儲的信息

      注釋

      起說明作用的信息

      注釋不能嵌套在標簽里

      只有在注釋的開始和結尾使用雙短橫線

      三短橫線只能出現(xiàn)在注釋的開頭而不能用在結尾

      #可以 > #不可以,注釋在標簽內(nèi) #可以,注釋內(nèi)容可以有一個短橫線 #不可以,雙短橫線只能出現(xiàn)在開頭或結尾 #可以,三短橫線只能出現(xiàn)在開頭 #不可以,三短橫線只能出現(xiàn)在開頭

      保留字符的處理

      XML中使用的符號可能跟實際符號相沖突,典型的就是左右尖括號

      使用實體引用(EntityReference)來表示保留字符

      score>80 #有錯誤,xml中不能出現(xiàn)> score>80 #使用實體引用

      把含有保留字符的部分放在CDATA塊內(nèi)部,CDATA塊把內(nèi)部信息視為不需要轉(zhuǎn)義

      80 ]]>

      常用的需要轉(zhuǎn)義的保留字符和對應的實體引用

      - &:& - <:< - >:> - ':' - ":" - 一共五個,每個實體引用都以&開頭并且以分號結尾

      XML標簽的簽名規(guī)則

      Pascal命名法

      用單詞表示,第一個字母大寫

      大小寫嚴格區(qū)分

      配對的標簽必須一致

      命名空間

      為了防止命名沖突

      ruo 18 2014 1-23-1

      如果歸并上述兩個內(nèi)容信息,會產(chǎn)生沖突

      ruo 18 2014 1-23-1

      為了避免沖突,需要給可能沖突元素添加命名空間

      xmlns: xml name space 的縮寫

      ruo 18 2014 1-23-1

      XML訪問

      讀取

      XML讀取分為兩個主要技術,SAX,DOM

      SAX(Simple API for XML):

      基于事件驅(qū)動的API

      利用SAX解析文檔涉及到解析器和事件處理兩部分

      特點:

      流式讀取

      DOM

      是W3C規(guī)定的XML編程接口

      一個XML文件在緩沖中以樹形結構保存,讀取

      用途

      定位瀏覽XML任何一個節(jié)點信息

      添加刪除相應內(nèi)容

      minidom

      minidom.parse(filename):加載讀取的xml文件, filename也可以是xml代碼

      doc.documentElement:獲取xml文檔對象,一個xml文件只有一個對于的文檔對象

      node.getAttribute(attr_name):獲取xml節(jié)點的屬性值

      node.getElementByTagName(tage_name):得到一個節(jié)點對象集合

      node.childNodes:得到所有孩子節(jié)點

      node.childNodes[index].nodeValue:獲取單個節(jié)點值

      node.firstNode:得到第一個節(jié)點,等價于node.childNodes[0]

      node.attributes[tage_name]

      案例v01

      import xml.dom.minidom # 負責解析xml文件 from xml.dom.minidom import parse # 使用minidom打開xml文件 DOMTree = xml.dom.minidom.parse("student.xml") # 得到文檔對象 doc = DOMTree.documentElement # 顯示子元素 for ele in doc.childNodes: if ele.nodeName == "Teacher": print("-------Node:{0}------".format(ele.nodeName)) childs = ele.childNodes for child in childs: if child.nodeName == "Name": # data是文本節(jié)點的一個屬性,表示他的值 print("Name:{0}".format(child.childNodes[0].data)) if child.nodeName == "Mobile": # data是文本節(jié)點的一個屬性,表示他的值 print("Mobile:{0}".format(child.childNodes[0].data)) if child.nodeName == "Age": # data是文本節(jié)點的一個屬性,表示他的值 print("Age:{0}".format(child.childNodes[0].data)) if child.hasAttribute("detail"): print("Age-detail:{0}".format(child.getAttribute("detail")))

      etree

      以樹形結構來表示xml

      root.getiterator:得到相應的可迭代的node集合

      root.iter

      find(node_name):查找指定node_name的節(jié)點,返回一個node

      root.findall(node_name):返回多個node_name的節(jié)點

      node.tag: node對應的tagename

      node.text:node的文本值

      node.attrib: 是node的屬性的字典類型的內(nèi)容

      案例v02

      import xml.etree.ElementTree root = xml.etree.ElementTree.parse("student.xml") print("利用getiterator訪問: ") nodes = root.getiterator() for node in nodes: print("{0}--{1}".format(node.tag, node.text)) print("利用find和findall方法: ") ele_teacher = root.find("Teacher") print(type(ele_teacher)) print("{0}--{1}".format(ele_teacher.tag, ele_teacher.text)) ele_stus = root.findall("Student") print(type(ele_stus)) for ele in ele_stus: print("{0}--{1}".format(ele.tag, ele.text)) for sub in ele.getiterator(): if sub.tag == "Name": if "Other" in sub.attrib.keys(): print(sub.attrib['Other'])

      student.xml

      ruo 18 18888888888 chen 14 LiSi 19 16666666666

      xml文件寫入

      更改

      ele.set: 屬性

      ele.append: 添加子元素

      ele.remove: 刪除元素

      案例v03

      import xml.etree.ElementTree as et tree = et.parse(r'to_edit.xml') root = tree.getroot() for e in root.iter('Name'): print(e.text) for stu in root.iter('Student'): name = stu.find('Name') if name != None: name.set('test', name.text * 2) stu = root.find('Student') # 生成一個新的元素 e = et.Element('ADDer') e.attrib = {'a':'b'} e.text = "我加的" stu.append(e) # 一定要把修改后的內(nèi)容寫回文件,否則修改無效 tree.write('to_edit.xml')

      to_edit.xml

      ruochen 18 18888888888 ZhangSan 14 luodayou 59 16666666666 LiSi 19 19999999999

      生成創(chuàng)建

      SubElement, 案例v04

      import xml.etree.ElementTree as et stu = et.Element("Student1") name = et.SubElement(stu, 'Name') name.attrib = {'lang', 'en'} name.text = 'maozedong' age = et.SubElement(stu, 'Age') age.text = 18 et.dump(stu)

      minidom寫入,案例v05

      import xml.dom.minidom # 在內(nèi)存中創(chuàng)建一個空的文檔 doc = xml.dom.minidom.Document() # 創(chuàng)建一個根節(jié)點Managers對象 root = doc.createElement('Managers') # 設置根節(jié)點的屬性 root.setAttribute('company', 'xx科技') root.setAttribute('address', '科技軟件園') # 將根節(jié)點添加到文檔對象中 doc.appendChild(root) managerList = [{'name':'joy', 'age':24, 'sex':'女'}, {'name':'tom', 'age':20, 'sex':'男'}, {'name':'ruby', 'age':30, 'sex':'女'} ] for i in managerList: nodeManager = doc.createElement('Manager') nodeName = doc.createElement('name') # 給葉子節(jié)點name設置一個文本節(jié)點,用于顯示玩文本內(nèi)容 nodeName.appendChild(doc.createTextNode(str(i['name']))) nodeAge = doc.createElement('Age') nodeAge.appendChild(doc.createTextNode(str(i['age']))) nodeSex = doc.createElement('sex') nodeSex.appendChild(doc.createTextNode(str(i['sex']))) # 將各子葉節(jié)點添加到父節(jié)點Manager中, # 最后將Manager添加到根節(jié)點Managers中 nodeManager.appendChild(nodeName) nodeManager.appendChild(nodeAge) nodeManager.appendChild(nodeSex) root.appendChild(nodeManager) # 開始寫xml文件 fp = open('Manager.xml', 'w') doc.writexml(fp, indent='\t', addindent='\t', newl='\n', encoding='utf-8')

      Manager.xml

      joy 24 tom 20 ruby 30

      etree創(chuàng)建,案例v06

      import xml.etree.ElementTree as et # 在內(nèi)存中創(chuàng)建一個空的文檔 etree = et.ElementTree() e = et.Element('Student') etree._setroot(e) e_name = et.SubElement(e, 'Name') e_name.text = 'hahaha' etree.write('v06.xml')

      v06.xml

      hahaha

      Python XML

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      上一篇:wps文字如何轉(zhuǎn)換成ppt
      下一篇:表格怎么匹配名字的數(shù)字
      相關文章
      久久亚洲成a人片| 国产亚洲视频在线播放| 亚洲av不卡一区二区三区 | 亚洲午夜久久久久久久久久| 一级毛片直播亚洲| 亚洲精品国产首次亮相| 亚洲日韩国产二区无码| 精品久久久久久亚洲精品| 亚洲午夜精品在线| 亚洲中文字幕人成乱码| 亚洲av午夜精品无码专区| 亚洲视频一区二区三区四区| 亚洲综合久久一本伊伊区| 中文字幕在线观看亚洲视频| 亚洲砖码砖专无区2023| 亚洲欧美一区二区三区日产| 亚洲国产精品无码久久| 日韩色视频一区二区三区亚洲| 精品亚洲成A人在线观看青青| 国产精品亚洲一区二区三区| 亚洲6080yy久久无码产自国产| 另类专区另类专区亚洲| 亚洲熟伦熟女新五十路熟妇| 亚洲中文字幕在线第六区| 亚洲级αV无码毛片久久精品| 亚洲αv久久久噜噜噜噜噜| 亚洲AV乱码久久精品蜜桃 | 国产亚洲精品美女| 亚洲综合色区在线观看| 亚洲女初尝黑人巨高清| 亚洲AV无码国产精品色午友在线 | 国产亚洲精品美女久久久久| jlzzjlzz亚洲乱熟在线播放| 中文字幕久久亚洲一区| 亚洲AV日韩精品久久久久久| 亚洲精品福利网泷泽萝拉| 亚洲一区AV无码少妇电影| 亚洲国产成人AV网站| 久久亚洲高清综合| 久久精品国产亚洲av麻| 亚洲第一成年网站大全亚洲|