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"] 例1:文件名:book.xml <?xml version="1.0" encoding="utf-8"?> <info> intro>Book message</> list id='001'> head>bookonename>python checknumber>001page>200list> ='002'>booktwo>python learn>002>300> > (1)创建DOM对象 import xml.dom.minidom dom1=xml.dom.minidom.parse('book.xml') (2)获取根字节 root=dom1.documentElement #这里得到的是根节点 返回结果为: info,None,1 其中: info是指根节点的名称root.nodeName None是指根节点的值root.nodeValue 1是指根节点的类型root.nodeType,更多节点类型如下表:
(3)子元素、子节点的访问 A、返回root子节点列表 ')
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可以使用下面的方法: intro)[0]
for node in node.childNodes:
if node.nodeType (node.TEXT_NODE,node.CDATA_SECTION_NODE):
print node.data
这种方法的不足之处是需要对类型进行判断,使用起来不是很方便。运行结果是: Book message 二、XML解析对上面的xml进行解析 方法1 代码如下: @小五义 http://www.cnblogs.com/xiaowuyi
#xml 解析
dom1.documentElement
book={}
booknode=root.getElementsByTagName(list)
for booklist booknode:
print ='*20
id:'+booklist.getAttribute(id)
for nodelist booklist.childNodes:
if nodelist.nodeType ==1:
print nodelist.nodeName+:, nodelist.childNodes:
运行结果为: ==================== 方法二: 代码: xml 解析
head:'+booklist.getElementsByTagName(head)[0].childNodes[0].nodeValue.strip()
name:namenumber:numberpage:page')[0].childNodes[0].nodeValue.strip()
运行结果与方法一一样。比较上面的两个方法,方法一根据xml的树结构进行了多次循环,可读性上不及方法二,方法直接对每一个节点进行操作,更加清晰。为了更加方法程序的调用,可以使用一个list加一个字典进行存储,具体见方法3: 解析
import xml.dom.minidom 运行结果为: [{'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 -*-xml 创建
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" 得到根节点
books=[{': ubookone',0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">200001python check'},{booktwo300002python learn}]
for book books:
sNode=doc.createElement()
sNode.setAttribute(]))
headNode=create_element(doc,book[])
nameNode=create_element(doc,0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">])
numberNode=create_element(doc,0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">])
pageNode=create_element(doc,0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">])
sNode.appendChild(headNode)
sNode.appendChild(nameNode)
sNode.appendChild(pageNode)
top_element.appendChild(sNode) 将遍历的节点添加到根节点下
xmlfile=open(bookdate.xmlw)
doc.writexml(xmlfile,addindent=' '*4,newl=nutf-8)
xmlfile.close()
运行后生成bookdate.xml文件,该文件与book.xml一样。 xml.etree.ElementTree篇 依然使用例1的例子,对xml进行解析分析。 1、加载XML 方法一:直接加载文件 xml.etree.ElementTree
root=xml.etree.ElementTree.parse(')
方法二:加载指定字符串 xml.etree.ElementTree
root = xml.etree.ElementTree.fromstring(xmltext)
这里xmltext是指定的字符串。 2、获取节点 方法一 利用getiterator方法得到指定节点 book_node=root.getiterator(")
方法二 利用getchildren方法得到子节点,如例1中,要得到list下面子节点head的值: @小五义 http://www.cnblogs.com/xiaowuyi
) book_node=root.getiterator( book_node: book_node_child=node.getchildren()[0] print book_node_child.tag+':'+book_node_child.text 运行结果为: head:bookone 方法三 使用find和findall方法 find方法找到指定的第一个节点: @小五义 http://www.cnblogs.com/xiaowuyi
)
book_find=root.find(for note book_find:
print note.tag+'+note.text
运行结果: head:bookone findall方法将找到指定的所有节点: )
book=root.findall(for book_list book:
book_list:
运行结果: head:bookone 3、对book.xml进行解析的实例 if book_list.attrib.has_key():
"+book_list.attrib[]
'+note.text
'*20
运行结果为: ==================== 注意: 当要获取属性值时,如list id=’001’,用attrib方法。 当要获取节点值时,如<head>bookone</head>中的bookone用text方法。 当要获取节点名时,用tag方法。
??
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |