# -*- coding: utf-8 -*-
import xml.dom.minidom
import os
import os.path

def txt2xml(pre_file='txt_file',after_file='xml_file'):
    line=[]
    temp=0
    files1 =os.listdir(pre_file)
    for xmlFile in files1:
        temp=temp+1
        if not os.path.isdir(xmlFile) and xmlFile.endswith('.txt'):#select txtfile
            with open(os.path.join(pre_file,xmlFile),'r') as fs:
                print "file %d is opened successfully"%temp
                managerList=[]
                doc = xml.dom.minidom.Document()#在内存中创建一个空的文档
                root = doc.createElement('annotation') #创建一个根节点Managers对象
                root.setAttribute('verified', 'no') #设置根节点的属性
                doc.appendChild(root)#将根节点添加到文档对象中
            
                nodedata=doc.createElement('folder')
                nodedata.appendChild(doc.createTextNode(after_file))
                root.appendChild(nodedata)
            
                nodedata=doc.createElement('filename')
                nodedata.appendChild(doc.createTextNode(xmlFile))
                root.appendChild(nodedata)
            
                nodedata=doc.createElement('path')
                nodedata.appendChild(doc.createTextNode(os.path.join(after_file,xmlFile)))
                root.appendChild(nodedata)
            
                nodedata=doc.createElement('source')
                nodeson=doc.createElement('database')
                nodeson.appendChild(doc.createTextNode('Unknown'))
                nodedata.appendChild(nodeson)
                root.appendChild(nodedata)
            
                nodedata=doc.createElement('size')
                nodewidth=doc.createElement('width')
                nodewidth.appendChild(doc.createTextNode('0'))
                nodeheight=doc.createElement('height')
                nodeheight.appendChild(doc.createTextNode('0'))
                nodedepth=doc.createElement('depth')
                nodedepth.appendChild(doc.createTextNode('0'))
                nodedata.appendChild(nodewidth)
                nodedata.appendChild(nodeheight)
                nodedata.appendChild(nodedepth)
                root.appendChild(nodedata)
            
                nodedata=doc.createElement('segmented')
                nodedata.appendChild(doc.createTextNode('0'))
                root.appendChild(nodedata)
        
                str=fs.read()
                line=str.split()
                length_line=len(line)-2
                
                
                for i in range(0,int(line[1])):
                    if (length_line/int(line[1]))==4:
                        managerList.append([{'xmin':line[2+i*4],'ymin':line[3+i*4],'xmax':line[4+i*4],'ymax':line[5+i*4]}])
                    elif (length_line/int(line[1]))==5:
                        managerList.append([{'xmin':line[2+i*5],'ymin':line[3+i*5],'xmax':line[4+i*5],'ymax':line[5+i*5],'score':line[6+i*5]}])
                    else:
                        print "file %s is wrong"%xmlFile
            
                for i in managerList :
                    for j in range(len(i)):
                        nodedata=doc.createElement('object')
                        nodename=doc.createElement('name')
                        nodename.appendChild(doc.createTextNode('NULL'))
                        nodepose=doc.createElement('pose')
                        nodepose.appendChild(doc.createTextNode('Unspecified'))
                        nodetruncated=doc.createElement('truncated')
                        nodetruncated.appendChild(doc.createTextNode('1'))
                        nodedifficult=doc.createElement('difficult')
                        nodedifficult.appendChild(doc.createTextNode('0'))
                        nodedata.appendChild(nodename)
                        nodedata.appendChild(nodepose)
                        nodedata.appendChild(nodetruncated)
                        nodedata.appendChild(nodedifficult)
                    
            
                        nodeManager = doc.createElement('bndbox')
                        nodeXmin = doc.createElement("xmin")
                        #给叶子节点name设置一个文本节点，用于显示文本内容
                        nodeXmin.appendChild(doc.createTextNode(i[j]['xmin']))
                        nodeYmin = doc.createElement("ymin")
                        nodeYmin.appendChild(doc.createTextNode(i[j]['ymin']))
                        nodeXmax = doc.createElement("xmax")
                        nodeXmax.appendChild(doc.createTextNode(i[j]['xmax']))
                        nodeYmax = doc.createElement("ymax")
                        nodeYmax.appendChild(doc.createTextNode(i[j]['ymax']))
        
                        #将各叶子节点添加到父节点Manager中，
                        #最后将Manager添加到根节点Managers中
                        nodeManager.appendChild(nodeXmin)
                        nodeManager.appendChild(nodeYmin)
                        nodeManager.appendChild(nodeXmax)
                        nodeManager.appendChild(nodeYmax)
                        if (length_line/int(line[1]))==5:
                            nodeScore = doc.createElement("score")                                   ########
                            nodeScore.appendChild(doc.createTextNode(i[j]['score']))
                            nodeManager.appendChild(nodeScore)
                        nodedata.appendChild(nodeManager)
                            
                    
                        root.appendChild(nodedata)
                #开始写xml文档
                if not(os.path.exists(after_file)):
                    os.mkdir(after_file)
                pathn=os.path.join(after_file,line[0])
                pathn+=".xml"
                fp = open(pathn, 'w')
                doc.writexml(fp, indent='\t', addindent='\t', newl='\n')
    print 'Transform_txt_xml() is OK'
        
if __name__ == '__main__':
    txt2xml()
            
    

