Python3生成XML檔案
什麼是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檔案如下:
Well Dola!
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檔案就像下面這個樣子:
Well Dola!
I Love Dola!
結束