1. xml简介
xml解析方法有两种标准: SAX和DOM。
1.1 SAX
SAX(Simple API for XML)是基于事件处理的,当XML文档顺序读入时,每次遇到一个元素都会触发相应的事件处理函数来处理。是一种流式处理,
优点:占用内存小,处理速度快。
缺点:处理过程比较麻烦。
1.2 DOM
DOM(Document Object Model)是通过一构建一个树结构来表现整个xml文档的,一旦被构建,可以通过DOM提供的接口来遍历树和提取相应的数据。
优点:操作方便;
缺点:占用内存大,速度慢;
2.python中xml操作
python中还提供了独特的xml解析方法。相比与SAX和DOM容易操作,更加快速,此方法为ElementTree。
1)xml.dom.minidom
2) xml.ElementTree
3)xml.sax + xml.dom
2.1使用xml.dom.minidom来读写xml
from xml.dom import minidom doc = minidom.parse("employees.xml") root = doc.documentElement employees = root.getElementsByTagName('employee') for e in employees: print e.nodeName print e.toxml() nameNode = e.getElementsByTagName("name")[0] print nameNode.childNodes print (nameNode.nodeName + ":" + nameNode.childNodes[0].nodeValue) ageNode = e.getElementsByTagName('age')[0] print ageNode.childNodes print ageNode.nodeName + ":" + ageNode.childNodes[0].nodeValue for n in e.childNodes: print n
2.2使用xml.dom.minidom来生成xml
import xml.dom.minidom impl = xml.dom.minidom.getDOMImplementation() dom = impl.createDocument(None, ' employees ' , None) root = dom.documentElement employee = dom.createElement( ' employee ' )
employee.setAttribute('id', '12') root.appendChild(employee) nameE = dom.createElement( ' name ' ) nameT = dom.createTextNode( ' linux ' ) nameE.appendChild(nameT) employee.appendChild(nameE) ageE = dom.createElement( ' age ' ) ageT = dom.createTextNode( ' 30 ' ) ageE.appendChild(ageT) employee.appendChild(ageE) f = open( ' employees2.xml ' , ' w ' , encoding = ' utf-8 ' ) dom.writexml(f, addindent = ' ' , newl = ' \n ' ,encoding = ' utf-8 ' ) f.close()
2.3使用minidom注意事项
- 使用parse()或者createDocument()返回的为DOM对象
- 使用DOM的documentElement属性可以锋利RootElement;
- DOM为树形结构,包含许多的nodes,其中element是node的一种,可以包含了node; textNode也是一种node,但它只能作为树叶
- 每个node都有nodeName, nodeValue,nodeType属性,nodeValue是结点的值,只对textNode有效。对于textNode想等到他的文本内容可以使用: .data属性
- nodeType是结点的类型,现在有以下:
'ATTRIBUTE_NODE'
'CDATA_SECTION_NODE'
'COMMENT_NODE'
'DOCUMENT_FRAGMENT_NODE'
'DOCUMENT_NODE'
'DOCUMENT_TYPE_NODE'
'ELEMENT_NODE'
'ENTITY_NODE'
'ENTITY_REFERENCE_NODE'
'NOTATION_NODE'
'PROCESSING_INSTRUCTION_NODE'
'TEXT_NODE'