python xml etree_python模块之xml.etree.ElementTree

Python有三种方法解析XML,SAX,DOM,以及ElementTree

###1.SAX (simple API for XML )

pyhton 标准库包含SAX解析器,SAX是一种典型的极为快速的工具,在解析XML时,不会占用大量内存。

但是这是基于回调机制的,因此在某些数据中,它会调用某些方法进行传递。这意味着必须为数据指定句柄,

以维持自己的状态,这是非常困难的。

###2.DOM(Document Object Model)

与SAX比较,DOM典型的缺点是比较慢,消耗更多的内存,因为DOM会将整个XML数读入内存中,并为树

中的第一个节点建立一个对象。使用DOM的好处是你不需要对状态进行追踪,因为每一个节点都知道谁是它的

父节点,谁是子节点。但是DOM用起来有些麻烦。

###3.ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少,这里主要

介绍ElementTree。

一 基本知识

1、插入节点

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

2、删除节点

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

3、在节点中插入属性

Element.set(key, value)

4、查找节点

a) Element.getiterator b) Element.getchildren c) Element.find d) Element.findall

#!/usr/bin/python

# -*- encoding: utf-8 -*-

import os

import sys

import os.path

import xml.etree.ElementTree as ET

def read_xml(xmlFile, destDir):

# print ‘==----------------=‘,ET.parse(xmlFile)

# 加载XML文件(2种方法,一是加载指定字符串,二是加载指定文件)c:\xml\1.xml

‘‘‘

<?xml version="1.0" ?>

X86

2

21205

107

0

0

.rdata

5064

100

0

0

0

0

:param xmlFile:

:param destDir:

:return:

‘‘‘

tree = ET.parse(xmlFile)

root = tree.getroot()

# root = ET.fromstring(xmlContent)

dir1_nodes = root.getchildren()

# create dir1

for dir1_node in dir1_nodes:

dir1 = destDir + os.path.sep + dir1_node.attrib[‘NAME‘]

# print dir1

if os.path.exists(dir1) == False:

os.mkdir(dir1)

# create dir2

dir2_nodes = dir1_node.getchildren()

for dir2_node in dir2_nodes:

dir2 = dir1 + os.path.sep + dir2_node.attrib[‘NAME‘]

if os.path.exists(dir2) == False:

os.mkdir(dir2)

# create file

dir3_nodes = dir2_node.getchildren()

for dir3_node in dir3_nodes:

dir3 = dir2 + os.path.sep + dir3_node.attrib[‘NAME‘]

# 参数w 会新建或覆盖一个文件,

f = open(dir3, ‘w‘)

# 遍历xml标签name=***.obj

prelen = 0

dir4_nodes = dir3_node.getchildren()

for dir4_node in dir4_nodes:

traversal(dir4_node, f, prelen)

f.close()

def traversal(node, f, prelen):

‘‘‘‘‘recursively traversal the rest of xml‘s content‘‘‘

length = node.getchildren()

attrs = ‘‘

texts = ‘‘

if len(node.attrib) > 0:

for key in node.attrib:

attrs += str(key) + ":" + str(node.attrib[key]) + " "

attrs = attrs[:-1]

f.write(‘-‘ * prelen + node.tag + ‘(‘ + attrs + ‘)‘)

else:

f.write(‘-‘ * prelen + node.tag)

if node.text != None:

f.write(‘:‘ + node.text)

f.write(‘\n‘)

if length != 0:

nodes = node.getchildren()

prelen += 4

for node1 in nodes:

traversal(node1, f, prelen)

def parseXmls(filePath, destDir):

‘‘‘‘‘traversal xmls directory‘‘‘

if os.path.isfile(filePath) and os.path.basename(filePath).endswith(‘.xml‘):

# print ‘filePath===‘,filePath

read_xml(filePath, destDir)

else:

for item in os.listdir(filePath):

print item

subpath = filePath + os.path.sep + item

parseXmls(subpath, destDir)

def main():

"Main function."

# input xml dir

while True:

dir = raw_input("input the dir:")

if not os.path.exists(dir):

print("you input dir is not existed!")

continue

else:

break

# create the dir of dest path that using to store the parsing xmls

‘‘‘‘‘destDir = os.path.split(dir)[0]+os.sep+time.strftime(‘%Y%m%d‘)

if not os.path.exists(destDir):

os.mkdir(destDir) ‘‘‘

destDir = os.path.split(dir)[0] + os.path.sep + os.path.basename(dir) + ‘xml‘

if os.path.exists(destDir) == False:

os.mkdir(destDir)

# recall the function of parse the xmls

parseXmls(dir, destDir)

if __name__ == ‘__main__‘:

main()

原文地址:http://www.cnblogs.com/dancesir/p/6915802.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值