XML minidom&&ElementTree

一、DOM寫XML文件

#導入minidom
    from xml.dom import minidom

    # 1.創建DOM樹對象
    dom=minidom.Document()
    # 2.創建根節點。每次都要用DOM對象來創建任何節點。
    root_node=dom.createElement('root')
    # 3.用DOM對象添加根節點
    dom.appendChild(root_node)

    # 用DOM對象創建元素子節點
    book_node=dom.createElement('book')
    # 用父節點對象添加元素子節點
    root_node.appendChild(book_node)
    # 設置該節點的屬性
    book_node.setAttribute('price','199')

    name_node=dom.createElement('name')
    root_node.appendChild(name_node)
    # 也用DOM創建文本節點,把文本節點(文字內容)看成子節點
    name_text=dom.createTextNode('計算機程序設計語言 第1版')
    # 用添加了文本的節點對象(看成文本節點的父節點)添加文本節點
    name_node.appendChild(name_text)

    # 每一個結點對象(包括dom對象本身)都有輸出XML內容的方法,如:toxml()--字符串, toprettyxml()--美化樹形格式。
    
    try:
        with open('dom_write.xml','w',encoding='UTF-8') as fh:
            # 4.writexml()第一個參數是目標文件對象,第二個參數是根節點的縮進格式,第三個參數是其他子節點的縮進格式,
            # 第四個參數制定了換行格式,第五個參數制定了xml內容的編碼。
            dom.writexml(fh,indent='',addindent='\t',newl='\n',encoding='UTF-8')
            print('寫入xml OK!')
    except Exception as err:
        print('錯誤信息:{0}'.format(err))

二、DOM解析XML文件

from xml.dom import minidom
    with open('dom_write.xml','r',encoding='utf8') as fh:
        # parse()獲取DOM對象
        dom=minidom.parse(fh)
        # 獲取根節點
        root=dom.documentElement
        # 節點名稱
        print(root.nodeName)
        # 節點類型:'ELEMENT_NODE',元素節點; 'TEXT_NODE',文本節點; 'ATTRIBUTE_NODE',屬性節點
        print(root.nodeType)
        # 獲取某個節點下所有子節點,是個列表
        print(root.childNodes)
        # 通過dom對象或根元素,再根據標簽名獲取元素節點,是個列表
        book=root.getElementsByTagName('book')[0]
        # 獲取節點屬性
        print(book.getAttribute('price'))
        
        # 獲取某個元素節點的文本內容,先獲取子文本節點,然后通過“data”屬性獲取文本內容
        name=root.getElementsByTagName('name')[0]
        name_text_node=name.childNodes[0]
        print(name_text_node.data)
    
        # 獲取某節點的父節點
        print(name.parentNode.nodeName)

三. ElemenTree解析xml

import xml.etree.ElementTree as ET

tree = ET.parse("country.xml")
root = tree.getroot()
print(root.tag, ":", root.attrib)  # 打印根元素的tag和屬性

# 遍歷xml文檔的第二層
for child in root:
    # 第二層節點的標簽名稱和屬性
    print(child.tag,":", child.attrib) 
    # 遍歷xml文檔的第三層
    for children in child:
        # 第三層節點的標簽名稱和屬性
        print(children.tag, ":", children.attrib)

2)ElementTree提供的方法

find(match)                                                    # 查找第一個匹配的子元素, match可以時tag或是xpaht路徑
findall(match)                                              # 返回所有匹配的子元素列表
findtext(match, default=None)                     # 
iter(tag=None)                                              # 以當前元素為根節點 創建樹迭代器,如果tag不為None,則以tag進行過濾
iterfind(match)                
# 遍歷所有的counry標簽
for country in root.findall("country"):
    # 查找country標簽下的第一個rank標簽
    rank = country.find("rank").text
    # 獲取country標簽的name屬性
    name = country.get("name")
    print(name, rank)
import xml.etree.ElementTree as ET

tree = ET.parse("output.xml")
root = tree.getroot()

for rank in root.iter("rank"):
    # attrib為屬性字典
    # 刪除對應的屬性updated
    del rank.attrib['updated']  

ET.dump(root)

結: 關于class xml.etree.ElementTree.Element 屬性相關

attrib                                 為包含元素屬性的字典
keys()             返回元素屬性名稱列表
items()                                   返回(name,value)列表
get(key, default=None)         獲取屬性
set(key, value)                      # 跟新/添加  屬性
del xxx.attrib[key]                  # 刪除對應的屬性
  1. 節點/元素 相關

刪除子元素remove()

import xml.etree.ElementTree as ET

tree = ET.parse("country.xml")
root = tree.getroot()

# 刪除rank大于50的國家
for country in root.iter("country"):
    rank = int(country.find("rank").text)
    if rank > 50:
        # remove()方法 刪除子元素
        root.remove(country)

ET.dump(root)

3.添加子元素

import xml.etree.ElementTree as ET

tree = ET.parse("country.xml")
root = tree.getroot()

country = root[0]
last_ele = country[len(list(country))-1]
last_ele.tail = '\n\t\t'
# 創建新的元素, tag為test_append
elem1 = ET.Element("test_append")
elem1.text = "elem 1"
# elem.tail = '\n\t'
country.append(elem1)

# SubElement() 其實內部調用的時append()
elem2 = ET.SubElement(country, "test_subelement")
elem2.text = "elem 2"

# extend()
elem3 = ET.Element("test_extend")
elem3.text = "elem 3"
elem4 = ET.Element("test_extend")
elem4.text = "elem 4"
country.extend([elem3, elem4])

# insert()
elem5 = ET.Element("test_insert")
elem5.text = "elem 5"
country.insert(5, elem5)

ET.dump(country)

4.創建xml文檔

想創建root Element,然后創建SubElement,最后將root element傳入ElementTree(element),創建tree,調用tree.write()方法寫入文件

對于創建元素的3個方法: 使用ET.Element、Element對象的makeelement()方法以及ET.SubElement

import xml.etree.ElementTree as ET


def subElement(root, tag, text):
    ele = ET.SubElement(root, tag)
    ele.text = text
    ele.tail = '\n'


root = ET.Element("note")

to = root.makeelement("to", {})
to.text = "peter"
to.tail = '\n'
root.append(to)

subElement(root, "from", "marry")
subElement(root, "heading", "Reminder")
subElement(root, "body", "Don't forget the meeting!")

tree = ET.ElementTree(root)
tree.write("note.xml", encoding="utf-8", xml_declaration=True)

由于原生保存的XML時默認無縮進,如果想要設置縮進的話, 需要修改保存方式

import xml.etree.ElementTree as ET
from xml.dom import minidom


def subElement(root, tag, text):
    ele = ET.SubElement(root, tag)
    ele.text = text


def saveXML(root, filename, indent="\t", newl="\n", encoding="utf-8"):
    rawText = ET.tostring(root)
    dom = minidom.parseString(rawText)
    with open(filename, 'w') as f:
        dom.writexml(f, "", indent, newl, encoding)


root = ET.Element("note")

to = root.makeelement("to", {})
to.text = "peter"
root.append(to)

subElement(root, "from", "marry")
subElement(root, "heading", "Reminder")
subElement(root, "body", "Don't forget the meeting!")

# 保存xml文件
saveXML(root, "note.xml")

https://www.cnblogs.com/hupeng1234/p/7262371.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容