您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python如何操作XML文件”,在日常操作中,相信很多人在Python如何操作XML文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python如何操作XML文件”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
XML(Extensible Markup Language):即可擴展標記語言,xml是互聯網數據傳輸的重要工具,它可以跨越互聯網任何的平臺,不受編程語言和的限制,可以說它是一個擁 有互聯網最高級別通行證的數據攜帶者。xml是當前處理結構化文檔信息中相當給力的技術,xml有 助于在服務器之間穿梭結構化數據,這使得開發人員更加得心應手的控制數據的存儲和傳輸。
Xml用于標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是-種允許用戶對自己的標記語言進行定義的源語 言。Xml是標準通用標記語言(SGML) 的子集,非常適合Web傳輸。XML提供統-的方法來描述和交換獨立于應用程序或供應商的結構化數據。
特點:
xm|與編程語言的開發平臺都無關
實現不同系統之間的數據交互。
作用:
配置應用程序和網站;
數據交互;
Ajax基石。
聲明
根元素
子元素
屬性
命名空間
限定名
與HTML類似,XML是另一種將數據存儲在標記之間的標記語言。它是人類可讀和可擴展的;也就是說,我們可以自由地定義自己的標記。XML中的屬性、元素和標記與HTML中的類似。XML文件可以有聲明,也可以沒有聲明。但是,如果它有一個聲明,那么它必須是XML文件的第一行。如:
<?xml version="1.0” encoding=' "UTF-8" standalone=" no”?>
這個聲明語句有三部分:版本、編碼和獨立性。版本說明正在使用的XML標準的版本; Encoding 表示在此文件中使用的字符編碼類型; Standalone 告訴解析器是否要外部信息來解釋XML文件的內容。
XML文件可以表示為稱為: XML 樹。這個XML樹從根元素(父元素)開始。這個根元素進一步分支到子元素。 XML文件的每個元素都是XML樹中的一個節點。那些沒有子節點的元素是葉節點。下圖清楚地區分了原始XML文件和XML文件的樹表示:
新建一個1.xml
文件:
<collection shelf="New Arrivals"> <class className="1班"> <code>2022001</code> <number>10</number> <teacher>小白</teacher> </class> <class className="2班"> <code>2022002</code> <number>20</number> <teacher>小紅</teacher> </class> <class className="3班"> <code>2022003</code> <number>30</number> <teacher>小黑</teacher> </class></collection>
ElementTree模塊提供了一個輕量級、Pythonic的API,同時還有一個高效的C語言實現,即xml.etree.cElementTree。與DOM相比,ET的速度更快,API使用更直接、方便。與SAX相比,ET.iterparse函數同樣提供了按需解析的功能,不會一次性在內存中讀入整個文檔。ET的性能與SAX模塊大致相仿,但是它的API更加高層次,用戶使用起來更加便捷。
Element對象方法:
類方法 | 說明 |
---|---|
Element.iter(tag=None) | 遍歷該Element所有后代,也可以指定tag進行遍歷尋找。 |
Element.iterfind(path, namespaces=None) | 根據tag或path查找所有的后代。 |
Element.itertext() | 遍歷所有后代并返回text值。 |
Element.findall(path) | 查找當前元素下tag或path能夠匹配的直系節點 |
Element.findtext(path, default=None, namespaces=None) | 尋找第一個匹配子元素,返回其text值。匹配對象可以為tag或path。 |
Element.find(path) | 查找當前元素下tag或path能夠匹配的首個直系節點。 |
Element.text | 獲取當前元素的text值。 |
Element.get(key, default=None) | 獲取元素指定key對應的屬性值,如果沒有該屬性,則返回default值。 |
Element.keys() | 返回元素屬性名稱列表 |
Element.items() | 返回(name,value)列表 |
Element.getchildren() | |
Element.getiterator(tag=None) | |
Element.getiterator(self, tag=None) |
屬性方法:
方法名 | 說明 |
---|---|
Element.tag | 節點名(tag)(str) |
Element.attrib | 屬性(attributes)(dict) |
Element.text | 文本(text)(str) |
Element.tail | 附加文本(tail) (str) |
Element[:] | 子節點列表(list) |
1)接下來,我們加載這個文檔,并進行解析:
>>> import xml.etree.ElementTree as ET>>> tree = ET.ElementTree(file='1.xml')
2) 然后,我們獲取根元素(root element):
>>> tree.getroot()<Element 'collection' at 0x000001FCC9BBFA90>
3)根元素(root)是一個Element對象。我們看看根元素都有哪些屬性:
>>> root = tree.getroot()>>> root.tag, root.attrib('collection', {'shelf': 'New Arrivals'})
4)根元素也具備遍歷其直接子元素的接口:
>>> for child_of_root in root:... print(child_of_root.tag, child_of_root.attrib)...class {'className': '1班'}class {'className': '2班'}class {'className': '3班'}
5)通過索引值來訪問特定的子元素:
>>> root[0].tag, root[0].text('class', '\n\t ')
6) 查找需要的元素
從上面的示例中,可以明顯發現我們能夠通過簡單的遞歸方法(對每一個元素,遞歸式訪問其所有子元素)獲取樹中的所有元素。但是,由于這是十分常見的工作,ET提供了一些簡便的實現方法。
Element對象有一個iter方法,可以對某個元素對象之下所有的子元素進行深度優先遍歷(DFS)。ElementTree對象同樣也有這個方法。下面是查找XML文檔中所有元素的最簡單方法:
>>> for elem in tree.iter():... print(elem.tag, elem.attrib)...collection {'shelf': 'New Arrivals'}class {'className': '1班'}code {}number {}teacher {}class {'className': '2班'}code {}number {}teacher {}class {'className': '3班'}code {}number {}teacher {}
7)對樹進行任意遍歷——遍歷所有元素,iter方法可以接受tag名稱,然后遍歷所有具備所提供tag的元素:
>>> for elem in tree.iter(tag='teacher'):... print(elem.tag, elem.text)...teacher 小白 teacher 小紅 teacher 小黑
8)支持通過XPath查找元素
>>> for elem in tree.iterfind('class/teacher'):... print(elem.tag, elem.text)...teacher 小白 teacher 小紅 teacher 小黑
9)查找所有具備某個name屬性的className元素:
>>> for elem in tree.iterfind('class[@className="1班"]'):... print(elem.tag, elem.attrib)...class {'className': '1班'}
10)完整解析代碼
import xml.etree.ElementTree as ET tree = ET.ElementTree(file='1.xml')print(type(tree))root = tree.getroot() # root是根元素print(type(root))print(root.tag)for index, child in enumerate(root): print("第%s個%s元素,屬性:%s" % (index, child.tag, child.attrib)) for i, child_child in enumerate(child): print("標簽:%s,內容:%s" % (child_child.tag, child_child.text))
輸出結果:
<class 'xml.etree.ElementTree.ElementTree'><class 'xml.etree.ElementTree.Element'>collection 第0個class元素,屬性:{'className': '1班'}標簽:code,內容:2022001標簽:number,內容:10標簽:teacher,內容:小白 第1個class元素,屬性:{'className': '2班'}標簽:code,內容:2022002標簽:number,內容:20標簽:teacher,內容:小紅 第2個class元素,屬性:{'className': '3班'}標簽:code,內容:2022003標簽:number,內容:30標簽:teacher,內容:小黑
DOM (Document Object Model)將XML文檔作為一棵樹狀結構進行分析,獲取節點的內容以及相關屬性,或是新增、刪除和修改節點的內容。XML解析器在加載XML文件以后,DQM模式將XML文件的元素視為一個樹狀結構的節點,一次性讀入內存。
解析代碼:
from xml.dom.minidom import parse# 讀取文件dom = parse('1.xml')# 獲取文檔元素對象elem = dom.documentElement# 獲取 classclass_list_obj = elem.getElementsByTagName('class')print(class_list_obj)print(type(class_list_obj))for class_element in class_list_obj: # 獲取標簽中內容 code = class_element.getElementsByTagName('code')[0].childNodes[0].nodeValue number = class_element.getElementsByTagName('number')[0].childNodes[0].nodeValue teacher = class_element.getElementsByTagName('teacher')[0].childNodes[0].nodeValue print('code:', code, ', number:', number, ', teacher:', teacher)
輸出結果:
[<DOM Element: class at 0x20141bc5c10>, <DOM Element: class at 0x20141bdf940>, <DOM Element: class at 0x20141bdfb80>]<class 'xml.dom.minicompat.NodeList'>code: 2022001 , number: 10 , teacher: 小白 code: 2022002 , number: 20 , teacher: 小紅 code: 2022003 , number: 30 , teacher: 小黑
doc.writexml()
:生成xml文檔,將創建的存在于內存中的xml文檔寫入本地硬盤中,這時才能看到新建的xml文檔
語法格式:writexml(file,indent=’’,addindent=’’,newl=’’,endocing=None)
參數說明:
file
:要保存為的文件對象名
indent
:根節點的縮進方式
allindent
:子節點的縮進方式
newl
:針對新行,指明換行方式
encoding
:保存文件的編碼方式
案例代碼:
import xml.dom.minidom # 1、在內存中創建一個空的文檔doc = xml.dom.minidom.Document() # 2、創建根元素root = doc.createElement('collection ')# print('添加的xml標簽為:',root.tagName) # 3、設置根元素的屬性root.setAttribute('type', 'New Arrivals') # 4、將根節點添加到文檔對象中doc.appendChild(root) # 5、創建子元素book = doc.createElement('book') # 6、添加注釋book.appendChild(doc.createComment('這是一條注釋')) # 7、設置子元素的屬性book.setAttribute('語言', 'java') # 8、子元素中嵌套子元素,并添加文本節點name = doc.createElement('name')name.appendChild(doc.createTextNode('java基礎'))price = doc.createElement('價格')price.appendChild(doc.createTextNode('99元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余100本'))# 9、將子元素添加到boot節點中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 10、將book節點添加到root根元素中root.appendChild(book)# 創建子元素book = doc.createElement('book')# 設置子元素的屬性book.setAttribute('語言', 'python')# 子元素中嵌套子元素,并添加文本節點name = doc.createElement('name')name.appendChild(doc.createTextNode('python基礎'))price = doc.createElement('價格')price.appendChild(doc.createTextNode('50元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余20本'))# 將子元素添加到boot節點中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 將book節點添加到root根元素中root.appendChild(book)print(root.toxml())fp = open('./書籍.xml', 'w', encoding='utf-8') # 需要指定utf-8的文件編碼格式,不然notepad中顯示十六進制doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding='utf-8')fp.close()
生成書籍.xml
文件:
向xml中插入新的子元素
案例代碼:
import xml.dom.minidomfrom xml.dom.minidom import parse# 對book.xml新增一個子元素english,并刪除math元素xml_file = './書籍.xml'# 拿到根節點domTree = parse(xml_file)rootNode = domTree.documentElement# rootNode.removeChild(rootNode.getElementsByTagName('book')[0])# print(rootNode.toxml())# 在內存中創建一個空的文檔doc = xml.dom.minidom.Document()book = doc.createElement('book')book.setAttribute('語言', 'c++')# 子元素中嵌套子元素,并添加文本節點name = doc.createElement('name')name.appendChild(doc.createTextNode('c++基礎'))price = doc.createElement('價格')price.appendChild(doc.createTextNode('200元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余300本'))# 將子元素添加到boot節點中book.appendChild(name)book.appendChild(price)book.appendChild(number)math_book = rootNode.getElementsByTagName('book')[0]# insertBefore方法 父節點.insertBefore(新節點,父節點中的子節點)rootNode.insertBefore(book, math_book)# appendChild將新產生的子元素在最后插入rootNode.appendChild(book)print(rootNode.toxml())with open(xml_file, 'w', encoding='utf-8') as fh: domTree.writexml(fh, indent='', addindent='\t', newl='', encoding='utf-8')
輸出結果:添加了新節點
記錄工作中常用的一個小技巧
cmd控制臺安裝第三方模塊:
pip install xmltodict
新建一個1.xml
文件:
<note date="23/04/2022"> <to>tom</to> <from>mary</from> <msg>love</msg></note>
轉換代碼實現:
import jsonimport xmltodictdef xml_to_json(xml_str): """parse是的xml解析器,參數需要 :param xml_str: xml字符串 :return: json字符串 """ xml_parse = xmltodict.parse(xml_str) # json庫dumps()是將dict轉化成json格式,loads()是將json轉化成dict格式。 # dumps()方法的ident=1,格式化json json_str = json.dumps(xml_parse, indent=1) return json_str XML_PATH = './1.xml' # xml文件的路徑with open(XML_PATH, 'r') as f: xmlfile = f.read() with open(XML_PATH[:-3] + 'json', 'w') as newfile: newfile.write(xml_to_json(xmlfile))
輸出結果(生成json文件):
新建test.json
文件:
{ "student": { "course": { "name": "math", "score": "90" }, "info": { "sex": "male", "name": "name" }, "stid": "10213" }}
轉換代碼實現:
import xmltodictimport jsondef json_to_xml(python_dict): """xmltodict庫的unparse()json轉xml :param python_dict: python的字典對象 :return: xml字符串 """ xml_str = xmltodict.unparse(python_dict) return xml_str JSON_PATH = './test.json' # json文件的路徑with open(JSON_PATH, 'r') as f: jsonfile = f.read() python_dict = json.loads(jsonfile) # 將json字符串轉換為python字典對象 with open(JSON_PATH[:-4] + 'xml', 'w') as newfile: newfile.write(json_to_xml(python_dict))
輸出結果(生成xml文件):
到此,關于“Python如何操作XML文件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。