Python操作xml

Xml XML指可擴展標記語言(Extensible Markup Language) XML被設計用於結構化、存儲和傳輸數據 XML是一種標記語言,很類似於HTML XML沒有像HTML那樣具有預定義標籤,需要程序員自定義標籤。 XML被設計爲具有自我描述性,並且是W3C的標準 XML元素 XML的元素是指從開始標籤直到結束標籤的部分(均包括開始結束)。 一個元素可以包含: 1、其他元素 2、文本 3、屬性 4、或混合以上所有 XML語法規則 所有的XML元素都必須有一個開始標籤和結束標籤,省略結束標籤是非法的。如: <root> content </root> XML標籤對大小寫敏感;比如: 下面是兩個不同的標籤 <Note>this is a test1</Note> <note>this is a test2</note> XML文檔必須有根元素。如: <note> <b>this is a test2</b> <name>joy</name> </note> XML必須正確嵌套,父元素必須完全包住子元素。如: <note><b>this is a test2</b></note> XML屬性值必須加引號,元素的屬性值都是一個鍵值對形式。如: <book category=" Python"></book> 注意: book元素中的屬性category的值是python必須用引號引起來,使用單引號和雙引號都可以,但是如果屬性值本身包含雙引號,外層就必須使用單引號;但如果包含了單引號,外層必須使用雙引號 XML命名規則 名稱可以包含字母、數字以及其他字符 名稱不能以數字或標點符號開頭 名稱不能以字母xml或XML開始 名稱不能包含空格 可以使用任何名稱,沒有保留字 名稱應該具有描述性,簡短和簡單,可以同時使用下劃線。 避免“-”、“.”、“:”等字符 Xml的註釋格式 <!--註釋內容--> Xml.dom解析XML 這個DOM的解析器在解析一個XML文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內存中的一個樹結構裏,之後利用DOM提供的不同函數來讀取該文檔的內容和結構,也可以把修改過的內容寫入XML文件 book.xml <?xml version="1.0" encoding="utf-8" ?> <!--this is a test about xml.--> <booklist type="science and engineering"> <book category="math"> <title>learning math</title> <author>張三</author> <pageNumber>561</pageNumber> </book> <book category="Python"> <title>learning Python</title> <author>李四</author> <pageNumber>600</pageNumber> </book> </booklist> minidom.parse(parser=None, bufsize=None) 該函數的作用是使用parse解析器打開xml文檔,並將其解析爲DOM文檔,也就是內 存中的一棵樹,並得到這個DOM對象 doc.documentElement 獲取xml文檔對象,就是拿到DOM樹的根。 >>> from xml.dom.minidom import parse >>> DOMTree = parse("d:\\book.xml")#把xml解析爲內存中的的一棵樹 >>> print(DOMTree) <xml.dom.minidom.Document object at 0x000000000241AC48> >>> booklist = DOMTree.documentElement#拿到樹的根 >>> print(booklist) <DOM Element: booklist at 0x23c6af8> doc.toxml(encoding=None) 返回xml的文檔內容 節點的xml文檔內容,只有節點對象可以調用 >>> from xml.dom.minidom import parse >>> DOMTree = parse("d:\\book.xml") >>> booklist = DOMTree.documentElement >>> print(booklist.toxml()) <booklist type="science and engineering"> <book category="math"> <title>learning math</title> <author>張三</author> <pageNumber>561</pageNumber> </book> <book category="Python"> <title>learning Python</title> <author>李四</author> <pageNumber>600</pageNumber> </book> </booklist> doc.lastChild 獲取節點的最後一個孩子節點 >>> booklist.lastChild <DOM Text node "'\n'"> doc.firstChild 獲取節點的第一個人孩子節點 >>> booklist.firstChild <DOM Text node "'\n '"> getElementsByTagName(name)獲取節點元素 獲取xml文檔中某個父節點下,具有相同節點名的節點對象的集合。返回的是list >>> from xml.dom.minidom import parse >>> DOMTree = parse("d:\\book.xml") >>> booklist = DOMTree.documentElement >>> books = booklist.getElementsByTagName("book")#獲取標籤爲book的所有節點 >>> print(books) [<DOM Element: book at 0x242a6d0>, <DOM Element: book at 0x23c69c8>] >>> print(type(books)) <class 'xml.dom.minicompat.NodeList'> >>> from xml.dom.minidom import parse >>> DOMTree = parse("d:\\book.xml") >>> booklist = DOMTree.documentElement >>> print(booklist.getElementsByTagName("book")[0].getElementsByTagName("author")[0]) <DOM Element: author at 0x242ad58> >>> print(booklist.getElementsByTagName("book")[0].getElementsByTagName("author")[0].toxml()) <author>張三</author> hasAttribute(name) 判斷節點對象是否包含指定屬性 >>> from xml.dom.minidom import parse >>> DOMTree = parse("d:\\book.xml") >>> booklist = DOMTree.documentElement >>> if booklist.hasAttribute("type"): ... print("booklist 元素存在屬性type")#判斷根節點booklist是否有type屬性 ... else: ... print("booklist 元素不存在屬性type") ... booklist 元素存在屬性type Node.getAttribute(name)獲取屬性 獲取節點node的屬性值 >>> from xml.dom.minidom import parse >>> DOMTree = parse("d:\\book.xml") >>> booklist = DOMTree.documentElement >>> if booklist.hasAttribute("type"): ... print("booklist存在屬性type") ... print(booklist.getAttribute("type")) ... else: ... print("booklist不存在屬性type") ... booklist存在屬性type science and engineering node.childNodes 返回節點node下所有子節點組成的list。 >>> from xml.dom.minidom import parse >>> DOMTree = parse("d:\\book.xml") >>> booklist = DOMTree.documentElement >>> #獲取所有book節點的集合 ... books = booklist.getElementsByTagName("book") >>> >>> print("第一本書的子節點: ",books[0].childNodes)這個需要指定取列表的那個元素,必須要帶上索引 第一本書的子節點: [<DOM Text node "'\n '">, <DOM Element: title at 0x243edf0>, <DOM Text node " \n '">, <DOM Element: author at 0x243ee88>, <DOM Text node "'\n '">, <DOM Element: pageNumber at 0x243ef20>, <DOM Text node "'\n '">] 獲取節點文本值 #coding=utf-8 from xml.dom.minidom import parse DOMTree = parse("d:\\book.xml") booklist = DOMTree.documentElement #獲取所有book節點的集合 books = booklist.getElementsByTagName("book") for book in books: if book.hasAttribute("category"): print("category is: ",book.getAttribute("categroy")) #先找到節點,然後再找節點下面的孩子文本節點 title = book.getElementsByTagName("title")[0].childNodes[0].data author = book.getElementsByTagName("author")[0].childNodes[0].data pageNumber = book.getElementsByTagName("pageNumber")[0].childNodes[0].data print("title: ",title) print("title: ",author) print("title: ",pageNumber) node .hasChildNodes() 判斷是否有子節點 #coding=utf-8 import xml.dom.minidom from xml.dom.minidom import parse #minidom解析器打開xml文檔並將其解析爲內存中的一棵樹 DOMTree = parse("d:\\book.xml") #獲取xml文檔對象,就是拿到樹的根 booklist = DOMTree.documentElement if booklist.hasAttribute("type") : #判斷根節點booklist是否有type屬性,有則獲取並打印屬性的值 print (u"Root element is", booklist.getAttribute("type")) #獲取booklist對象中所有book節點的list集合 books = booklist.getElementsByTagName("book") print ("books",books[0]) print (u"book節點的個數:", books.length) print (books[0]) if books[0].hasChildNodes(): print (u"存在子節點:",books[0].childNodes) else: print (u"不存在子節點") xml.dom解析xml的一個實例 movies.xml <?xml version="1.0" encoding="utf-8" ?> <!--this is a test about xml.--> <collection shelf="New Arrivals"> <movie title="Enemy Behind"> <type>War, Thriller</type> <format>DVD</format> <year>2003</year> <rating>PG</rating> <stars>10</stars> <description>Talk about a US-Japan war</description> </movie> <movie title="Transformers"> <type>Anime, Science Fiction</type> <format>DVD</format> <year>1989</year> <rating>R</rating> <stars>8</stars> <description>A schientific fiction</description> </movie> <movie title="Trigun"> <type>Anime, Action</type> <format>DVD</format> <episodes>4</episodes> <rating>PG</rating> <stars>10</stars> <description>Vash the Stampede!</description> </movie> <movie title="Ishtar"> <type>Comedy</type> <format>VHS</format> <rating>PG</rating> <stars>2</stars> <description>Viewable boredom</description> </movie> </collection> 示例: #coding=utf-8 import xml.dom.minidom from xml.dom.minidom import parse DOMTree = parse("d:\\movies.xml") collection = DOMTree.documentElement movies = collection.getElementsByTagName("movie") for movie in movies: for element in ["type","format","rating","description"]: node = movie.getElementsByTagName(element)[0] textNode = node.childNodes[0] print("%s節點文本是: %s" %(node,textNode.data)) #coding=utf-8 from xml.dom.minidom import parse import xml.dom.minidom # 使用minidom解析器打開 XML 文檔 DOMTree = xml.dom.minidom.parse(r"e:\\xml\\movies.xml") collection = DOMTree.documentElement if collection.hasAttribute("shelf"): print ("Root element : %s" % collection.getAttribute("shelf")) # 在集合中獲取所有電影 movies = collection.getElementsByTagName("movie") # 打印每部電影的詳細信息 for movie in movies: print ("*****Movie*****") if movie.hasAttribute("title"): print ("Title: %s" % movie.getAttribute("title")) type = movie.getElementsByTagName('type')[0] print ("Type: %s" % type.childNodes[0].data) format = movie.getElementsByTagName('format')[0] print ("Format: %s" % format.childNodes[0].data) rating = movie.getElementsByTagName('rating')[0] print ("Rating: %s" % rating.childNodes[0].data) description = movie.getElementsByTagName('description')[0] print ("Description: %s" % description.childNodes[0].data) xml.dom創建XML文件 創建xml文件步驟: 1、創建xml空文檔 2、產生根對象 3、往根對象加數據 4、把xml內存對象寫入文件 minidom.Document()創建xml空文檔 該方法用於創建一個空白的xml文檔對象,並返回這個doc對象。每個xml文檔都是一個Document對象,代表着內存中的DOM樹。 #coding=utf-8 import xml.dom.minidom as xdm #在內存中創建一個空的文檔 doc = xdm.Document() print (doc) #此處創建一個根節點Managers對象 root = doc.createElement("Managers") print (u"添加的xml標籤爲:", root.tagName) node.setAttribute(attname, value) 該方法表示給節點添加屬性-值對(Attribute) 。 參數說明: attname :屬性的名稱 value :屬性的值 import xml.dom.minidom as xdm #在內存中創建一個空的文檔 doc = xdm.Document() print(doc) #創建一個根節點Managers對象 root = doc.createElement("Managers") print (u"添加的xml標籤爲:", root.tagName) # 給根節點root添加屬性 root.setAttribute("company","光榮之路") print("根節點的屬性: ",root.getAttribute("company")) doc.createTextNode(data) 給葉子節點添加文本節點 #coding=utf-8 import xml.dom.minidom #在內存中創建一個空的文檔 doc = xml.dom.minidom.Document() print(doc) #創建一個根節點Managers對象 root = doc.createElement('company') print (u"添加的xml標籤爲:", root.tagName) # 給根節點root添加屬性 root.setAttribute('name', '光榮之路教育科技有限公司') # 給根節點添加一個葉子節點 ceo = doc.createElement("ceo") #給葉子節點name設置一個文本節點,用於顯示文本內容 ceo.appendChild(doc.createTextNode("呼總")) print(ceo.tagName) print (u"給葉子節點添加文本節點成功") 添加子節點 #coding=utf-8 import xml.dom.minidom #在內存中創建一個空的文檔 doc = xml.dom.minidom.Document() #創建一個根節點companys對象 root = doc.createElement('companys') # 給根節點root添加屬性 root.setAttribute("name","光榮之路") #將根節點添加到文檔對象中 doc.appendChild(root) # 給根節點添加一個葉子節點 company = doc.createElement("gloryroad") # 葉子節點下再嵌套葉子節點 name = doc.createElement("Name") # 給節點添加文本節點 name.appendChild(doc.createTextNode("光榮之路")) ceo = doc.createElement("CEO") ceo.appendChild(doc.createTextNode("吳總")) # 將各葉子節點添加到父節點company中 # 然後將company添加到跟節點companys中 company.appendChild(name) company.appendChild(ceo) root.appendChild(company) print(doc.toxml()) 注意父節點和子節點的關係,依賴於appendChild()函數 以上'companys是根節點 gloryroad是1級子節點 name、 ceo 是2級子節點 Parent.appendChild(childNode) 把子節點childNode添加到父節點parent中 doc.writexml()生成xml文檔 該方法用於將內存中xml文檔樹寫入文件中,並保存到本地磁盤。上面創建的xml文檔僅是存在內存中的,並未真正寫入硬盤,只有調用該方法以後,才能真正將我們創建的xml文檔寫入本地硬盤,這時我們才能在硬盤中看見新建的xml文檔。 語法: Writexml(file,indent=””,addindent=””,newl=””,encoding=None) 參數說明: file:要保存爲的文件對象名 Indent:根節點的縮進方式 addindent:子節點的縮進方式 newl: 針對新行,指明換行方式 encoding:保存文件的編碼方式 示例: #coding=utf-8 import xml.dom.minidom #在內存中創建一個空的文檔 doc = xml.dom.minidom.Document() #創建一個根節點companys對象 root = doc.createElement('companys') # 給根節點root添加屬性 root.setAttribute("name","公司列表") #將根節點添加到文檔對象中 doc.appendChild(root) # 給根節點添加一個葉子節點 company = doc.createElement("gloryroad") # 葉子節點下再嵌套葉子節點 name = doc.createElement("Name") # 給節點添加文本節點 name.appendChild(doc.createTextNode("光榮之路")) ceo = doc.createElement("CEO") ceo.appendChild(doc.createTextNode("吳總")) # 將各葉子節點添加到父節點company中 # 然後將company添加到跟節點companys中 company.appendChild(name) company.appendChild(ceo) root.appendChild(company) fp = open('d:\\company.xml','w') doc.writexml(fp,indent='',addindent='\t',newl='\n',encoding="utf-8") fp.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章