前端之家收集整理的这篇文章主要介绍了
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</>
list id='001'>
head>bookonename>python checknumber>001page>200list>
='002'>booktwo>python learn>002>300>
>
(1)创建DOM对象
@H_
301_132@
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子节点列表
')
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'\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可以使用下面的方法:
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()
解析
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'}]
-*- 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=[{
': u
bookone',0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">200
001python 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()