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

#coding:utf-8
import os,sys,os.path
import xml.etree.ElementTree as ET 
def read_xml(xmlFile,destDir):
    '''
  parse  xml,规则是解析如下格式的xml,root下的2、3级建立目录,第4级建立文件,4级以下以合适的形式写入到文件中
  <?xml version="1.0" ?> 
- <root>
  - <FILE_DIRECTORY NAME="ca002">
   - <FILE_DIRECTORY NAME="RT_CA">
    - <FILE_NAME NAME="0000.obj">
        - <COFF_FILE_HEAD BEGIN="0" END="20">
              <Machine>X86</Machine> 
              <NumberOfSections>2</NumberOfSections> 
              <PointerToSymbolTable>21205</PointerToSymbolTable> 
              <NumberOfSymbols>107</NumberOfSymbols> 
              <SizeOfOptionalHeader>0</SizeOfOptionalHeader> 
              <Characteristics>0</Characteristics> 
          </COFF_FILE_HEAD>
        - <COFF_IMAGE_SECTIONS>
            - <COFF_IMAGE_SECTION INDEX="0">
              <Name>.rdata</Name> 
              <SizeOfRawData>5064</SizeOfRawData> 
              <PointerToRawData>100</PointerToRawData> 
              <PointerToRelocations>0</PointerToRelocations> 
              <PointerToLinenumbers>0</PointerToLinenumbers> 
              <NumberOfRelocations>0</NumberOfRelocations> 
              <NumberOfLinenumbers>0</NumberOfLinenumbers> 
  '''
    # 加载XML文件(2种方法,一是加载指定字符串,二是加载指定文件)
    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']
        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']
                #print dir3
                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
        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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值