1. 程式人生 > >XML生成與解析(DOM、ElementTree)

XML生成與解析(DOM、ElementTree)

xml.dom篇

    DOM是Document Object Model的簡稱,XML 文件的高階樹型表示。該模型並非只針對 Python,而是一種普通XML 模型。Python 的 DOM 包是基於 SAX 構建的,並且包括在 Python 2.0 的標準 XML 支援裡。

一、xml.dom的簡單介紹

1、主要方法:

minidom.parse(filename):載入讀取XML檔案

doc.documentElement:獲取XML文件物件

node.getAttribute(AttributeName):獲取XML節點屬性值

node.getElementsByTagName(TagName):獲取XML節點物件集合

node.childNodes :返回子節點列表。

node.childNodes[index].nodeValue:獲取XML節點值

node.firstChild:訪問第一個節點,等價於pagexml.childNodes[0]

返回Node節點的xml表示的文字:

doc = minidom.parse(filename)

doc.toxml('UTF-8')

訪問元素屬性:

Node.attributes["id"]
a.name #就是上面的 "id"
a.value #屬性的值 
2、舉例說明

例1:檔名:book.xml

複製程式碼
<?xml version="1.0" encoding="utf-8"
?> <info> <intro>Book message</intro> <list id='001'> <head>bookone</head> <name>python check</name> <number>001</number> <page>200</page> </list> <list id='002'> <head
>booktwo</head> <name>python learn</name> <number>002</number> <page>300</page> </list> </info>
複製程式碼

(1)建立DOM物件

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')

(2)獲取根位元組

root=dom1.documentElement #這裡得到的是根節點
print root.nodeName,',',root.nodeValue,',',root.nodeType

返回結果為:

info , None , 1

其中:

info是指根節點的名稱root.nodeName

None是指根節點的值root.nodeValue

1是指根節點的型別root.nodeType,更多節點型別如下表:

NodeType

Named Constant

1

ELEMENT_NODE

2

ATTRIBUTE_NODE

3

TEXT_NODE

4

CDATA_SECTION_NODE

5

ENTITY_REFERENCE_NODE

6

ENTITY_NODE

7

PROCESSING_INSTRUCTION_NODE

8

COMMENT_NODE

9

DOCUMENT_NODE

10

DOCUMENT_TYPE_NODE

11

DOCUMENT_FRAGMENT_NODE

12

NOTATION_NODE

(3)子元素、子節點的訪問

A、返回root子節點列表

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
#print root.nodeName,',',root.nodeValue,',',root.nodeType
print root.childNodes

執行結果為:

[<DOM Text node "u'\n   '">, <DOM Element: intro at 0x124ef58>, <DOM Text node "u'\n    '">, <DOM Element: list at 0x1254058>, <DOM Text node "u'\n\n    '">, <DOM Element: list at 0x1254418>, <DOM Text node "u'\n\n'">]

B、獲取XML節點值,如返回根節點下第二個子節點intro的值和名字,新增下面一句

print root.childNodes[1].nodeName,root.childNodes[1].nodeValue

執行結果為:

intro None

C、訪問第一個節點

print root.firstChild.nodeName

執行結果為:

#text

D、獲取已經知道的元素名字的值,如要獲取intro後的book message可以使用下面的方法:

複製程式碼
import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
#print root.nodeName,',',root.nodeValue,',',root.nodeType
node= root.getElementsByTagName('intro')[0]
for node in node.childNodes:
    if node.nodeType in (node.TEXT_NODE,node.CDATA_SECTION_NODE):
        print node.data
複製程式碼

這種方法的不足之處是需要對型別進行判斷,使用起來不是很方便。執行結果是:

Book message

二、XML解析

對上面的xml進行解析

方法1 程式碼如下:

複製程式碼
#@小五義 http://www.cnblogs.com/xiaowuyi
#xml 解析

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
book={}
booknode=root.getElementsByTagName('list')
for booklist in booknode:
    print '='*20
    print 'id:'+booklist.getAttribute('id')
    for nodelist in  booklist.childNodes:
        if nodelist.nodeType ==1:
            print nodelist.nodeName+':',
        for node in nodelist.childNodes:
            print node.data
複製程式碼

執行結果為:

====================
id:001
head: bookone
name: python check
number: 001
page: 200
====================
id:002
head: booktwo
name: python learn
number: 002
page: 300

方法二:

程式碼:

複製程式碼
#@小五義 http://www.cnblogs.com/xiaowuyi
#xml 解析 

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
book={}
booknode=root.getElementsByTagName('list')
for booklist in booknode:
    print '='*20
    print 'id:'+booklist.getAttribute('id')
    print 'head:'+booklist.getElementsByTagName('head')[0].childNodes[0].nodeValue.strip()
    print 'name:'+booklist.getElementsByTagName('name')[0].childNodes[0].nodeValue.strip()
    print 'number:'+booklist.getElementsByTagName('number')[0].childNodes[0].nodeValue.strip()
    print 'page:'+booklist.getElementsByTagName('page')[0].childNodes[0].nodeValue.strip()
複製程式碼

        執行結果與方法一一樣。比較上面的兩個方法,方法一根據xml的樹結構進行了多次迴圈,可讀性上不及方法二,方法直接對每一個節點進行操作,更加清晰。為了更加方法程式的呼叫,可以使用一個list加一個字典進行儲存,具體見方法3:

複製程式碼
#@小五義 http://www.cnblogs.com/xiaowuyi
#xml 解析 

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
book=[]
booknode=root.getElementsByTagName('list')
for booklist in booknode:
    bookdict={}
    bookdict['id']=booklist.getAttribute('id')
    bookdict['head']=booklist.getElementsByTagName('head')[0].childNodes[0].nodeValue.strip()
    bookdict['name']=booklist.getElementsByTagName('name')[0].childNodes[0].nodeValue.strip()
    bookdict['number']=booklist.getElementsByTagName('number')[0].childNodes[0].nodeValue.strip()
    bookdict['page']=booklist.getElementsByTagName('page')[0].childNodes[0].nodeValue.strip()
    book.append(bookdict)
print book

複製程式碼

執行結果為:

[{'head': u'bookone', 'page': u'200', 'number': u'001', 'id': u'001', 'name': u'python check'}, {'head': u'booktwo', 'page': u'300', 'number': u'002', 'id': u'002', 'name': u'python learn'}]

該列表裡包含了兩個字典。

三、建立XML檔案

這裡用方法三得到的結果,建立一個xml檔案。

複製程式碼
# -*- coding: cp936 -*-
#@小五義 http://www.cnblogs.com/xiaowuyi
#xml 建立 

import xml.dom
def create_element(doc,tag,attr):
    #建立一個元素節點
    elementNode=doc.createElement(tag)
    #建立一個文字節點
    textNode=doc.createTextNode(attr)
    #將文字節點作為元素節點的子節點
    elementNode.appendChild(textNode)
    return elementNode

dom1=xml.dom.getDOMImplementation()#建立文件物件,文件物件用於建立各種節點。
doc=dom1.createDocument(None,"info",None)
top_element = doc.documentElement# 得到根節點
books=[{'head': u'bookone', 'page': u'200', 'number': u'001', 'id': u'001', 'name': u'python check'}, {'head': u'booktwo', 'page': u'300', 'number': u'002', 'id': u'002', 'name': u'python learn'}]
for book in books:
    sNode=doc.createElement('list')
    sNode.setAttribute('id',str(book['id']))
    headNode=create_element(doc,
            
           

相關推薦

XML生成解析DOMElementTree

xml.dom篇     DOM是Document Object Model的簡稱,XML 文件的高階樹型表示。該模型並非只針對 Python,而是一種普通XML 模型。Python 的 DOM 包是基於 SAX 構建的,並且包括在 Python 2.0 的標準 XML 支援裡。 一、xml.dom的簡單

android中常用的xml生成解析

總結了一下解析XML的三種方式。下圖為要解析的XML的格式。 解析了兩種方式的XML,一種是檔案,另一種是流。 程式碼中用到的許多的類是我虛構出來的,例如在第二種解析中用到的User類。使用者應該先寫這個類,寫出他們的屬性,並寫get和set方法才可以的。 <?xml

構建微服務架構Spring Cloud:服務註冊發現EurekaConsul

comm 簡介 foundry 架構 eas args 包含 什麽 其他 Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全

關於SpringCloud微服務雲架構構建B2B2C電子商務平臺分析:服務註冊發現EurekaConsul

Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。 Spring

Spring Cloud構建微服務架構:服務註冊發現EurekaConsul

Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。 Spring Cloud包含

計算機基礎重點考題解析

題目1: 下列關於硬碟的敘述,錯誤的是_________。 A.一塊硬碟通常包含多張碟片 B.硬碟中的cache能有效地改善資料傳輸的效能 C.硬碟的資料讀寫速度為毫秒級 D.硬碟中的資料記錄在連續的螺

dae格式檔案解析頂點蒙皮

dae格式比較開放,不同軟體匯出的格式可能有所不同,但原理應當是一樣的。以Blender匯出的為例。 首先看骨骼部分,隨便做了一個模型,先看節選的library_controller部分。 <library_controllers> <controller

淺析phpwind9.0之cookies的生成機制解析成功登陸後

由於工作的需要,所以開始分析phpwind9.0論壇的部分功能的處理機制,這一節來分析cookies生成機制。 登陸頁面進入這裡: 進行處理,具體函式: welcomeAction() 注意到這個函式的這一行: $login->setLoginCookie($thi

.Net Core 權限驗證授權AuthorizeFilterActionFilterAttribute

etc dir != pan miss add type .net core sync 在.Net Core 中使用AuthorizeFilter或者ActionFilterAttribute來實現登錄權限驗證和授權 一、AuthorizeFilter 新建授權類All

Android中三種常用解析XML的方式DOMSAXPULL簡介及區別

字符串 lan win name屬性 Coding 空間 toc log fin XML在各種開發中都廣泛應用,Android也不例外。作為承載數據的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的

_044_Android_解析XML的幾種方式的原理特點:DOMSAXPULL

轉自https://blog.csdn.net/tianhouquan/article/details/82467820 ,感謝作者的無私分享。  解析XML的幾種方式的原理與特點:DOM、SAX、PULL。 XML的解析方式有很多,光開源的就有十多種:如Xerces、J

Android學習記錄1—Android中XML檔案的序列化生成解析

xml檔案是非常常用的,在android中json和xml是非常常用的兩種封裝資料的形式,從伺服器中獲取資料也經常是這兩種形式的,所以學會生成和解析xml和json是非常有用的,json相對來說是比較簡單的,咱不做介紹了,這裡給大家講一下xml的序列化生成和解析。不廢話了,

筆記:XML-解析文檔-流機制解析SAXStAX

輸入 tex 字符數 表示 getname 重要 樹形 puts ron DOM 解析器完整的讀入XML文檔,然後將其轉換成一個樹型的數據結構,對於大多數應用,DOM 都運行很好,但是,如果文檔很大,並且處理算法又非常簡單,可以在運行時解析節點,而不必看到完整的樹形

Android中XML文件的序列化生成解析

eval test director 南海 attribute trac cli found dir 首先,我把Person的實體類 package net.loonggg.test; public class Person { privat

Java學習總結21——XML文檔解析DOM解析,SAX解析

Oz 學習總結 AR javax exce 天氣 efault ray XP 一.XML簡介1.可擴展性標記語言(eXtensible Markup Language)2.XML用於描述數據3.應用場合:(1)持久化存儲數據(2)數據交換(3)數據配置4.XML語法(1)文

android解析XML的三種方式 DOMSAXPULL

第一種DOM是全部解析出來,消耗記憶體空間 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

VTD解析XML VTDGenAutoPilot

轉載:【https://blog.csdn.net/JAVA_8206/article/details/52084846】 轉載:【https://blog.csdn.net/phiill_01/article/details/8727292】 程式碼 + 理論 程式碼

關於Qt中QJsonObjectQJsonArray生成解析JSON檔案

使用QJsonArray寫檔案:   QString fileName = ":load.json";     QFile srcFile(fileName);     if(!srcFile.open(QFile::ReadWrite)){ &

XML文件解析DOM解析DOM的增刪改查

DOM解析XML的概述: DOM解析優點: 整個文件樹在記憶體中,便於操作; 可以修改,刪除、重新排列XML; 可以隨機訪問任何一個節點,訪問效率高。 DOM解析的缺點: 佔用記憶體大,佔用資源多

JSON解析類庫之Fastjson1 --- Fastjson類庫學習, 生成解析json資料,json字串Java物件互轉

JSON解析類庫之Fastjson(1) --- Fastjson基礎知識、簡單JavaBean與複雜Bean物件與JSON互轉 -- Fastjson類庫學習, 生成與解析json資料,json