python使用minidom读写xml

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'

posted @ 2013-04-17 22:12  Mingxx  阅读(1917)  评论(0编辑  收藏  举报