天天看点

python - xml.etree

python语言解析xml文件的常用的有两种方式:

    * 通过MiniDom库解析xml文件

    * 通过ElementTree库解析xml文件

使用ElementTree方式解析xml文件比起使用minidom库解析xml文件的,操作要方便的多。 ElementTree属于python标准库的一部分,ElementTree的parse()方法是这个库的主要入口,它使用文件名或流对象作为参数,parse()方法会立即解析完整个文档,它返回的对象是整个文档的对象,而不是根元素,如果要获取根元素,可以调用getroot()方法。

1、插入节点

Element.insert(index, element) 、ET.SubElement(parent, tag[, attrib[, **extra]]) 、Element.append(subelement)

2、删除节点

Element.remove(subelement) 删除一个节点、Element.clear()删除该节点下所有子节点

3、在节点中插入属性

Element.set(key, value)

# -*- coding:UTF-8 -*-

import xml.etree.ElementTree as ET

import xml.dom.minidom as minidom

def getRoot(xmlpath):

    '''

    xmlpath:xml: path to xml file

    '''

    root = ET.parse(xmlpath).getroot()

    return root

def display(root):

    rough_string = ET.tostring(root, 'utf-8')

    reparsed = minidom.parseString(rough_string)

    print reparsed.toprettyxml(indent="  " , encoding="utf-8");

if __name__ == '__main__':

    root = ET.Element('bookList')

    bookE = ET.SubElement(root,'book')  #1

    bookE.set('id', 'ISO001')

    authorE = ET.Element('author')    #2

    authorE.text = 'Gaosilin'

    bookE.append(authorE)

    nameE = ET.Element('name')   #3

    nameE.text = 'java'

    bookE.insert(1,nameE)

    bookE.insert(0,nameE)

    nameE.text = 'C language'

    display(root)

    bookE.remove(nameE)

    bookE.remove(authorE)

    bookE.clear()

    root.remove(bookE)

    display(root)

输出结果为:

<?xml version="1.0" encoding="utf-8"?>

<bookList>

  <book id="ISO001">

    <name>

      C language

    </name>

    <author>

      Gaosilin

    </author>

    <name>

      C language

    </name>

  </book>

</bookList>

<?xml version="1.0" encoding="utf-8"?>

<bookList/>

DOM是Document Object Model的简称,它是以对象树来表示一个XML。 

import xml.dom.minidom 

dom = xml.dom.minidom.parse("data.xml")

root = dom.documentElement 

print root.nodeName,root.nodeValue,root.nodeType

对于已经知道元素名字的子元素,可以通过使用getElementsByTagName()方法访问,例:

root.getElementsByTagName("tagname") #读取tagname子元素,返回的结果是一个列表。

如果要得到某元素下的所有子节点,可以使用childNodes属性:

root.childNodes

getElementsByTagName()可以搜索当前元素的所有子元素,包括所有层次的子元素。childNodes只保存了当前元素的第一层子结点。

    for node in doc.getElementsByTagName("tagname"):   

        print (node, node.tagName, node.getAttribute("attributename"))