溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python操作xml

發(fā)布時(shí)間:2020-06-09 12:36:08 來源:網(wǎng)絡(luò) 閱讀:315 作者:qq5a16e6241946e 欄目:編程語言
Xml
?XML指可擴(kuò)展標(biāo)記語言(Extensible Markup Language)
?XML被設(shè)計(jì)用于結(jié)構(gòu)化、存儲(chǔ)和傳輸數(shù)據(jù)
?XML是一種標(biāo)記語言,很類似于HTML
?XML沒有像HTML那樣具有預(yù)定義標(biāo)簽,需要程序員自定義標(biāo)簽。
?XML被設(shè)計(jì)為具有自我描述性,并且是W3C的標(biāo)準(zhǔn)

XML元素
XML的元素是指從開始標(biāo)簽直到結(jié)束標(biāo)簽的部分(均包括開始結(jié)束)。
一個(gè)元素可以包含:
1、其他元素
2、文本
3、屬性
4、或混合以上所有

XML語法規(guī)則
所有的XML元素都必須有一個(gè)開始標(biāo)簽和結(jié)束標(biāo)簽,省略結(jié)束標(biāo)簽是非法的。如:
<root> content </root>

XML標(biāo)簽對(duì)大小寫敏感;比如: 下面是兩個(gè)不同的標(biāo)簽
<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屬性值必須加引號(hào),元素的屬性值都是一個(gè)鍵值對(duì)形式。如:
<book category=" Python"></book>
注意:
book元素中的屬性category的值是python必須用引號(hào)引起來,使用單引號(hào)和雙引號(hào)都可以,但是如果屬性值本身包含雙引號(hào),外層就必須使用單引號(hào);但如果包含了單引號(hào),外層必須使用雙引號(hào)

XML命名規(guī)則
?名稱可以包含字母、數(shù)字以及其他字符
?名稱不能以數(shù)字或標(biāo)點(diǎn)符號(hào)開頭
?名稱不能以字母xml或XML開始
?名稱不能包含空格
?可以使用任何名稱,沒有保留字
?名稱應(yīng)該具有描述性,簡(jiǎn)短和簡(jiǎn)單,可以同時(shí)使用下劃線。
?避免“-”、“.”、“:”等字符
Xml的注釋格式
<!--注釋內(nèi)容-->

Xml.dom解析XML
這個(gè)DOM的解析器在解析一個(gè)XML文檔時(shí),一次性讀取整個(gè)文檔,把文檔中所有元素保存在內(nèi)存中的一個(gè)樹結(jié)構(gòu)里,之后利用DOM提供的不同函數(shù)來讀取該文檔的內(nèi)容和結(jié)構(gòu),也可以把修改過的內(nèi)容寫入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)
該函數(shù)的作用是使用parse解析器打開xml文檔,并將其解析為DOM文檔,也就是內(nèi)
存中的一棵樹,并得到這個(gè)DOM對(duì)象
doc.documentElement
獲取xml文檔對(duì)象,就是拿到DOM樹的根。

>>> from xml.dom.minidom import parse
>>> DOMTree = parse("d:\\book.xml")#把xml解析為內(nèi)存中的的一棵樹
>>> print(DOMTree)
<xml.dom.minidom.Document object at 0x000000000241AC48>
>>> booklist = DOMTree.documentElement#拿到樹的根
>>> print(booklist)
<DOM Element: booklist at 0x23c6af8>

doc.toxml(encoding=None)
返回xml的文檔內(nèi)容
節(jié)點(diǎn)的xml文檔內(nèi)容,只有節(jié)點(diǎn)對(duì)象可以調(diào)用

>>> 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
獲取節(jié)點(diǎn)的最后一個(gè)孩子節(jié)點(diǎn)

>>> booklist.lastChild
<DOM Text node "'\n'">

doc.firstChild
獲取節(jié)點(diǎn)的第一個(gè)人孩子節(jié)點(diǎn)

>>> booklist.firstChild
<DOM Text node "'\n  '">

getElementsByTagName(name)獲取節(jié)點(diǎn)元素
獲取xml文檔中某個(gè)父節(jié)點(diǎn)下,具有相同節(jié)點(diǎn)名的節(jié)點(diǎn)對(duì)象的集合。返回的是list

>>> from xml.dom.minidom import parse
>>> DOMTree = parse("d:\\book.xml")
>>> booklist = DOMTree.documentElement
>>> books = booklist.getElementsByTagName("book")#獲取標(biāo)簽為book的所有節(jié)點(diǎn)
>>> 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)
判斷節(jié)點(diǎn)對(duì)象是否包含指定屬性

>>> from xml.dom.minidom import parse
>>> DOMTree = parse("d:\\book.xml")
>>> booklist = DOMTree.documentElement
>>> if booklist.hasAttribute("type"):
...     print("booklist 元素存在屬性type")#判斷根節(jié)點(diǎn)booklist是否有type屬性
... else:
...     print("booklist 元素不存在屬性type")
...
booklist 元素存在屬性type

Node.getAttribute(name)獲取屬性
獲取節(jié)點(diǎn)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
返回節(jié)點(diǎn)node下所有子節(jié)點(diǎn)組成的list。
>>> from xml.dom.minidom import parse
>>> DOMTree = parse("d:\\book.xml")
>>> booklist = DOMTree.documentElement
>>> #獲取所有book節(jié)點(diǎn)的集合
... books = booklist.getElementsByTagName("book")
>>>
>>> print("第一本書的子節(jié)點(diǎn): ",books[0].childNodes)這個(gè)需要指定取列表的那個(gè)元素,必須要帶上索引

第一本書的子節(jié)點(diǎn):  [<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  '">]

獲取節(jié)點(diǎn)文本值
#coding=utf-8
from xml.dom.minidom import parse
DOMTree = parse("d:\\book.xml")
booklist = DOMTree.documentElement
#獲取所有book節(jié)點(diǎn)的集合
books = booklist.getElementsByTagName("book")

for book in books:
    if book.hasAttribute("category"):
        print("category is: ",book.getAttribute("categroy"))
    #先找到節(jié)點(diǎn),然后再找節(jié)點(diǎn)下面的孩子文本節(jié)點(diǎn)
    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()
判斷是否有子節(jié)點(diǎn)
#coding=utf-8
import xml.dom.minidom
from xml.dom.minidom import parse 
#minidom解析器打開xml文檔并將其解析為內(nèi)存中的一棵樹
DOMTree = parse("d:\\book.xml")
#獲取xml文檔對(duì)象,就是拿到樹的根
booklist = DOMTree.documentElement
if booklist.hasAttribute("type") : 
    #判斷根節(jié)點(diǎn)booklist是否有type屬性,有則獲取并打印屬性的值

    print (u"Root element is", booklist.getAttribute("type"))
#獲取booklist對(duì)象中所有book節(jié)點(diǎn)的list集合
books = booklist.getElementsByTagName("book")
print ("books",books[0])
print (u"book節(jié)點(diǎn)的個(gè)數(shù):", books.length)
print (books[0])

if books[0].hasChildNodes():
    print (u"存在子節(jié)點(diǎn):",books[0].childNodes)
else:
    print (u"不存在子節(jié)點(diǎn)")

xml.dom解析xml的一個(gè)實(shí)例
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節(jié)點(diǎn)文本是: %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")
# 打印每部電影的詳細(xì)信息

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創(chuàng)建XML文件
創(chuàng)建xml文件步驟:
1、創(chuàng)建xml空文檔
2、產(chǎn)生根對(duì)象
3、往根對(duì)象加數(shù)據(jù)
4、把xml內(nèi)存對(duì)象寫入文件

minidom.Document()創(chuàng)建xml空文檔
該方法用于創(chuàng)建一個(gè)空白的xml文檔對(duì)象,并返回這個(gè)doc對(duì)象。每個(gè)xml文檔都是一個(gè)Document對(duì)象,代表著內(nèi)存中的DOM樹。

#coding=utf-8
import xml.dom.minidom as xdm
#在內(nèi)存中創(chuàng)建一個(gè)空的文檔
doc = xdm.Document()
print (doc)
#此處創(chuàng)建一個(gè)根節(jié)點(diǎn)Managers對(duì)象
root = doc.createElement("Managers")
print (u"添加的xml標(biāo)簽為:", root.tagName)

node.setAttribute(attname, value)
該方法表示給節(jié)點(diǎn)添加屬性-值對(duì)(Attribute) 。
參數(shù)說明:
attname :屬性的名稱
value :屬性的值

import xml.dom.minidom as xdm
#在內(nèi)存中創(chuàng)建一個(gè)空的文檔
doc = xdm.Document()
print(doc)
#創(chuàng)建一個(gè)根節(jié)點(diǎn)Managers對(duì)象
root = doc.createElement("Managers")
print (u"添加的xml標(biāo)簽為:", root.tagName)
# 給根節(jié)點(diǎn)root添加屬性
root.setAttribute("company","光榮之路")
print("根節(jié)點(diǎn)的屬性: ",root.getAttribute("company"))

doc.createTextNode(data)
給葉子節(jié)點(diǎn)添加文本節(jié)點(diǎn)
#coding=utf-8
import xml.dom.minidom
#在內(nèi)存中創(chuàng)建一個(gè)空的文檔
doc = xml.dom.minidom.Document()
print(doc)
#創(chuàng)建一個(gè)根節(jié)點(diǎn)Managers對(duì)象
root = doc.createElement('company')
print (u"添加的xml標(biāo)簽為:", root.tagName)
# 給根節(jié)點(diǎn)root添加屬性
root.setAttribute('name', '光榮之路教育科技有限公司')
# 給根節(jié)點(diǎn)添加一個(gè)葉子節(jié)點(diǎn)
ceo = doc.createElement("ceo")
#給葉子節(jié)點(diǎn)name設(shè)置一個(gè)文本節(jié)點(diǎn),用于顯示文本內(nèi)容
ceo.appendChild(doc.createTextNode("呼總"))
print(ceo.tagName)

print (u"給葉子節(jié)點(diǎn)添加文本節(jié)點(diǎn)成功")

添加子節(jié)點(diǎn)
#coding=utf-8
import xml.dom.minidom
#在內(nèi)存中創(chuàng)建一個(gè)空的文檔
doc = xml.dom.minidom.Document()
#創(chuàng)建一個(gè)根節(jié)點(diǎn)companys對(duì)象
root = doc.createElement('companys')
# 給根節(jié)點(diǎn)root添加屬性
root.setAttribute("name","光榮之路")
#將根節(jié)點(diǎn)添加到文檔對(duì)象中
doc.appendChild(root)
# 給根節(jié)點(diǎn)添加一個(gè)葉子節(jié)點(diǎn)
company = doc.createElement("gloryroad")
# 葉子節(jié)點(diǎn)下再嵌套葉子節(jié)點(diǎn)
name = doc.createElement("Name")
# 給節(jié)點(diǎn)添加文本節(jié)點(diǎn)
name.appendChild(doc.createTextNode("光榮之路"))

ceo = doc.createElement("CEO")
ceo.appendChild(doc.createTextNode("吳總"))

# 將各葉子節(jié)點(diǎn)添加到父節(jié)點(diǎn)company中
# 然后將company添加到跟節(jié)點(diǎn)companys中
company.appendChild(name)
company.appendChild(ceo)
root.appendChild(company)
print(doc.toxml())

注意父節(jié)點(diǎn)和子節(jié)點(diǎn)的關(guān)系,依賴于appendChild()函數(shù)
以上'companys是根節(jié)點(diǎn)
     gloryroad是1級(jí)子節(jié)點(diǎn)
        name、 ceo 是2級(jí)子節(jié)點(diǎn)

Parent.appendChild(childNode)
把子節(jié)點(diǎn)childNode添加到父節(jié)點(diǎn)parent中
doc.writexml()生成xml文檔
該方法用于將內(nèi)存中xml文檔樹寫入文件中,并保存到本地磁盤。上面創(chuàng)建的xml文檔僅是存在內(nèi)存中的,并未真正寫入硬盤,只有調(diào)用該方法以后,才能真正將我們創(chuàng)建的xml文檔寫入本地硬盤,這時(shí)我們才能在硬盤中看見新建的xml文檔。
語法:
Writexml(file,indent=””,addindent=””,newl=””,encoding=None)
參數(shù)說明:
file:要保存為的文件對(duì)象名
Indent:根節(jié)點(diǎn)的縮進(jìn)方式
addindent:子節(jié)點(diǎn)的縮進(jìn)方式
newl: 針對(duì)新行,指明換行方式
encoding:保存文件的編碼方式

示例:
#coding=utf-8
import xml.dom.minidom
#在內(nèi)存中創(chuàng)建一個(gè)空的文檔
doc = xml.dom.minidom.Document()
#創(chuàng)建一個(gè)根節(jié)點(diǎn)companys對(duì)象
root = doc.createElement('companys')
# 給根節(jié)點(diǎn)root添加屬性
root.setAttribute("name","公司列表")
#將根節(jié)點(diǎn)添加到文檔對(duì)象中
doc.appendChild(root)
# 給根節(jié)點(diǎn)添加一個(gè)葉子節(jié)點(diǎn)
company = doc.createElement("gloryroad")
# 葉子節(jié)點(diǎn)下再嵌套葉子節(jié)點(diǎn)
name = doc.createElement("Name")
# 給節(jié)點(diǎn)添加文本節(jié)點(diǎn)
name.appendChild(doc.createTextNode("光榮之路"))

ceo = doc.createElement("CEO")
ceo.appendChild(doc.createTextNode("吳總"))

# 將各葉子節(jié)點(diǎn)添加到父節(jié)點(diǎn)company中
# 然后將company添加到跟節(jié)點(diǎn)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()
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI