什麼是XML?

XML 指可擴充套件標記語言(e

X

tensible

M

arkup

L

anguage)。

XML 被設計用來傳輸和儲存資料。

XML 是一套定義語義標記的規則,這些標記將文件分成許多部件並對這些部件加以標識。

XML也是元標記語言,即定義了用於定義其他與特定領域有關的、語義的、結構化的標記語言的句法語言。

Python對XML的解析

Python 有三種方法解析 XML,SAX,DOM,以及 ElementTree:

SAX (simple API for XML )。Python 標準庫包含 SAX 解析器,SAX 用事件驅動模型,透過在解析XML的過程中觸發一個個的事件並呼叫使用者定義的回撥函式來處理XML檔案。

DOM(Document Object Model)。將 XML 資料在記憶體中解析成一個樹,透過對樹的操作來操作XML。

ElementTree(元素樹)。ElementTree就像一個輕量級的DOM,具有方便友好的API。程式碼可用性好,速度快,消耗記憶體少。

注:因DOM需要將XML資料對映到記憶體中的樹,一是比較慢,二是比較耗記憶體,而SAX流式讀取XML檔案,比較快,佔用記憶體少,但需要使用者實現回撥函式(handler)。

開始構建 XML 樹

本篇文章使用ELmentTree建立XML檔案,這裡不涉及其他兩種方法的使用。

#!/usr/bin/python3

# -*- coding:utf-8 -*-

#from xml。etree import ElementTree as etree

from

xml。etree。ElementTree

import

Element

from

xml。etree。ElementTree

import

SubElement

from

xml。etree。ElementTree

import

ElementTree

from

xml。dom

import

minidom

# generate root node

root

=

Element

‘root’

# generate first child-node head

head

=

SubElement

root

‘head’

# child-node of head node

title

=

SubElement

head

‘title’

title

text

=

“Well Dola!”

# generate second child-node body

body

=

SubElement

root

‘body’

body

text

=

“I Love Dola!”

tree

=

ElementTree

root

# write out xml data

tree

write

‘result。xml’

encoding

=

‘utf-8’

生成的XML檔案如下:

</p><p>Well Dola!</p><div class="base-box"></div><p>

I Love Dola!

可以看到ElementTree輸出的xml檔案沒有換行,沒有縮排,十分難以閱讀。

接下來我們可以美化生成的XML檔案:

#!/usr/bin/python3

# -*- coding:utf-8 -*-

# elemnt為傳進來的Elment類,引數indent用於縮排,newline用於換行

def

prettyXml

element

indent

newline

level

=

0

):

# 判斷element是否有子元素

if

element

# 如果element的text沒有內容

if

element

text

==

None

or

element

text

isspace

():

element

text

=

newline

+

indent

*

level

+

1

else

element

text

=

newline

+

indent

*

level

+

1

+

element

text

strip

()

+

newline

+

indent

*

level

+

1

# 此處兩行如果把註釋去掉,Element的text也會另起一行

#else:

#element。text = newline + indent * (level + 1) + element。text。strip() + newline + indent * level

temp

=

list

element

# 將elemnt轉成list

for

subelement

in

temp

# 如果不是list的最後一個元素,說明下一個行是同級別元素的起始,縮排應一致

if

temp

index

subelement

<

len

temp

-

1

):

subelement

tail

=

newline

+

indent

*

level

+

1

else

# 如果是list的最後一個元素, 說明下一行是母元素的結束,縮排應該少一個

subelement

tail

=

newline

+

indent

*

level

# 對子元素進行遞迴操作

prettyXml

subelement

indent

newline

level

=

level

+

1

from

xml。etree

import

ElementTree

#匯入ElementTree模組

tree

=

ElementTree

parse

‘result。xml’

#解析test。xml這個檔案,該檔案內容如上文

root

=

tree

getroot

()

#得到根元素,Element類

prettyXml

root

\t

\n

#執行美化方法

#ElementTree。dump(root) #顯示出美化後的XML內容

tree

write

‘result。xml’

encoding

=

‘utf-8’

美化後的XML檔案就像下面這個樣子:

</p><p>Well Dola!</p><p>

I Love Dola!

結束