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"))