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()
Python操作xml
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.