python网络编程学习笔记(八):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文件 访问元素属性: Node.attributes["id"] 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'> </info> (1)创建DOM对象 复制代码 代码如下: import xml.dom.minidom dom1=xml.dom.minidom.parse('book.xml') (2)获取根字节 root=dom1.documentElement #这里得到的是根节点 返回结果为: info,None,1 其中: info是指根节点的名称root.nodeName 1是指根节点的类型root.nodeType,更多节点类型如下表:
(3)子元素、子节点的访问 A、返回root子节点列表 复制代码 代码如下: import xml.dom.minidom dom1=xml.dom.minidom.parse('book.xml') root=dom1.documentElement #print root.nodeName,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'nn '">,<DOM Element: list at 0x1254418>,<DOM Text node "u'nn'">] 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.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 运行结果为: ==================== 方法二: 代码: 复制代码 代码如下: #@小五义 http://www.cnblogs.com/xiaowuyi #xml 解析 import xml.dom.minidom 运行结果与方法一一样。比较上面的两个方法,方法一根据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文件 复制代码 代码如下: # -*- coding: cp936 -*- #@小五义 http://www.cnblogs.com/xiaowuyi #xml 创建 import xml.dom dom1=xml.dom.getDOMImplementation()#创建文档对象,文档对象用于创建各种节点。 运行后生成bookdate.xml文件,该文件与book.xml一样。 xml.etree.ElementTree篇 依然使用例1的例子,对xml进行解析分析。 1、加载XML 方法一:直接加载文件 复制代码 代码如下: import xml.etree.ElementTree root=xml.etree.ElementTree.parse('book.xml') 方法二:加载指定字符串 复制代码 代码如下: import xml.etree.ElementTree root = xml.etree.ElementTree.fromstring(xmltext)这里xmltext是指定的字符串。 2、获取节点 方法一 利用getiterator方法得到指定节点 book_node=root.getiterator("list") 方法二 利用getchildren方法得到子节点,如例1中,要得到list下面子节点head的值: 复制代码 代码如下: #@小五义 http://www.cnblogs.com/xiaowuyiimport xml.etree.ElementTree root=xml.etree.ElementTree.parse('book.xml') book_node=root.getiterator("list") for node in book_node: book_node_child=node.getchildren()[0] print book_node_child.tag+':'+book_node_child.text 运行结果为: head:bookone 方法三 使用find和findall方法 find方法找到指定的第一个节点: 复制代码 代码如下: # -*- coding: cp936 -*- #@小五义 import xml.etree.ElementTree root=xml.etree.ElementTree.parse('book.xml') book_find=root.find('list') for note in book_find: print note.tag+':'+note.text 运行结果: head:bookone findall方法将找到指定的所有节点: 复制代码 代码如下: # -*- coding: cp936 -*- #@小五义 import xml.etree.ElementTree root=xml.etree.ElementTree.parse('book.xml') book=root.findall('list') for book_list in book: for note in book_list: print note.tag+':'+note.text 运行结果: head:bookone 3、对book.xml进行解析的实例 复制代码 代码如下: # -*- coding: cp936 -*- #@小五义 import xml.etree.ElementTree root=xml.etree.ElementTree.parse('book.xml') book=root.findall('list') for book_list in book: print '='*20 if book_list.attrib.has_key('id'): print "id:"+book_list.attrib['id'] for note in book_list: print note.tag+':'+note.text print '='*20 运行结果为: ==================== 注意: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |