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生成與解析(DOM、ElementTree)
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:服務註冊與發現(Eureka、Consul)
comm 簡介 foundry 架構 eas args 包含 什麽 其他 Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全
關於SpringCloud微服務雲架構構建B2B2C電子商務平臺分析:服務註冊與發現(Eureka、Consul)
Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。 Spring
Spring Cloud構建微服務架構:服務註冊與發現(Eureka、Consul)
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 權限驗證與授權(AuthorizeFilter、ActionFilterAttribute)
etc dir != pan miss add type .net core sync 在.Net Core 中使用AuthorizeFilter或者ActionFilterAttribute來實現登錄權限驗證和授權 一、AuthorizeFilter 新建授權類All
Android中三種常用解析XML的方式(DOM、SAX、PULL)簡介及區別
字符串 lan win name屬性 Coding 空間 toc log fin XML在各種開發中都廣泛應用,Android也不例外。作為承載數據的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的
_044_Android_解析XML的幾種方式的原理與特點:DOM、SAX、PULL
轉自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-解析文檔-流機制解析器(SAX、StAX)
輸入 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的三種方式 DOM、SAX、PULL
第一種DOM是全部解析出來,消耗記憶體空間 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
VTD解析XML( VTDGen、AutoPilot )
轉載:【https://blog.csdn.net/JAVA_8206/article/details/52084846】 轉載:【https://blog.csdn.net/phiill_01/article/details/8727292】 程式碼 + 理論 程式碼
關於Qt中QJsonObject、QJsonArray生成與解析JSON檔案
使用QJsonArray寫檔案: QString fileName = ":load.json"; QFile srcFile(fileName); if(!srcFile.open(QFile::ReadWrite)){ &
XML文件解析:DOM解析與DOM的增刪改查
DOM解析XML的概述: DOM解析優點: 整個文件樹在記憶體中,便於操作; 可以修改,刪除、重新排列XML; 可以隨機訪問任何一個節點,訪問效率高。 DOM解析的缺點: 佔用記憶體大,佔用資源多
JSON解析類庫之Fastjson(1) --- Fastjson類庫學習, 生成與解析json資料,json字串與Java物件互轉
JSON解析類庫之Fastjson(1) --- Fastjson基礎知識、簡單JavaBean與複雜Bean物件與JSON互轉 -- Fastjson類庫學習, 生成與解析json資料,json