excel表如何根據(jù)顏色排序(excel表如何按照顏色排序)
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), 可擴展標記語言
標記語言:語言中使用尖括號括起來的文本字符串標記
可擴展:用戶可以定義自己需要的標記
例如:
exam.xml
是w3c組織制定的一個標準
XML描述的數(shù)據(jù)本身,即數(shù)據(jù)的結構和定義
HTML側重于如何顯示web頁面中的數(shù)據(jù)
XML文檔的構成
處理命令(可以認為一個文件內(nèi)只有一個處理命令)
最多只有一行
且必須在第一行
內(nèi)容是與xml本身處理起相關的一些聲明或者指令
以xml關鍵字開頭
一般用于聲明XML的版本和采用的編碼
version屬性是必須的
encoding屬性用來支出xml解釋器使用的編碼
根元素(一個文件內(nèi)只有一個根元素)
在整個xml文件中,可以把他看做一個樹形結構
根元素有且只能有一個
子元素
屬性
內(nèi)容
表明標簽所存儲的信息
注釋
起說明作用的信息
注釋不能嵌套在標簽里
只有在注釋的開始和結尾使用雙短橫線
三短橫線只能出現(xiàn)在注釋的開頭而不能用在結尾
保留字符的處理
XML中使用的符號可能跟實際符號相沖突,典型的就是左右尖括號
使用實體引用(EntityReference)來表示保留字符
把含有保留字符的部分放在CDATA塊內(nèi)部,CDATA塊把內(nèi)部信息視為不需要轉(zhuǎn)義
80 ]]>
常用的需要轉(zhuǎn)義的保留字符和對應的實體引用
- &:& - <:< - >:> - ':' - ":" - 一共五個,每個實體引用都以&開頭并且以分號結尾
XML標簽的簽名規(guī)則
Pascal命名法
用單詞表示,第一個字母大寫
大小寫嚴格區(qū)分
配對的標簽必須一致
命名空間
為了防止命名沖突
如果歸并上述兩個內(nèi)容信息,會產(chǎn)生沖突
為了避免沖突,需要給可能沖突元素添加命名空間
xmlns: xml name space 的縮寫
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
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
生成創(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
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
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)容。