2017-10-09 1 views
0

J'ai un fichier xml comme indiqué.itération à travers un nombre fixe d'éléments, à la fois dans un fichier xml. python Arborescence des éléments

<?xml version="1.0" encoding="UTF-8"?> 
<DataRoot> 
    <Data> 
    <Data> 
    <Data> 
     <child> 
      ....text.... 
     </child> 
    </Data> 
    <Data> 
    <Data> 
    <Data> 
    <Data> 
     . 
     . 
     . 
</DataRoot> 

Mon exigence est de diviser ce xml pour les petits fichiers XML avec un nombre fixe d'éléments <Data> dans chaque fichier. Je suis capable de diviser à chaque <Data> à un xml, mais incapable de prendre un nombre fixe <Data> élément et former le fichier.

ma sortie est: fichier1:

<DataRoot> 
    <Data> 
</DataRoot> 

fichier2:

<DataRoot> 
    <Data> 
</DataRoot> 

Mais la sortie est nécessaire:

fichier1:

<DataRoot> 
    <Data> 
    <Data> 
    <Data> 
</DataRoot> 

fichier2:

<DataRoot> 
    <Data> 
    <Data> 
    <Data> 
</DataRoot> 

Ici va mon code.

import os 
    import xml.etree.ElementTree as ET 
    import lxml.etree as LT 

    file_path = 'filepath\\file.xml' 
    file_name = (os.path.splitext((os.path.basename("%s"%file_path)))[0]) 
    print file_name 

    tree = ET.ElementTree(file='%s'%file_path) 
    tre = LT.ElementTree(file='%s'%file_path) 
    root = tree.getroot().tag 


    i = 0 
    for elm in (tree.findall('Data')): 
     text = ET.tostring(elm) 
     i += 1 
     filename = "%d"%i+"_of_%s"%file_name+".xml" 
     with open(filepath\\%s'%filename, 'wb') as f: 
      f.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") 
      f.write(("<"+ "%s"%root+">")) 
      f.write(text) 
      f.write(("</"+ "%s"%root+">")) 
      f.close() 

Nombre de fichiers à former est pas deux, cela dépend de la taille du document XML source, en explication que j'ai donné un nombre aléatoire 2. Merci à l'avance

Répondre

0

ajouter seulement compteur et vérifier quand passer au fichier suivant:

i = 0 
per_file = 5 # number of data per xml-file 
file_counter = 1 
filename = "%d"%file_counter+"_of_%s"%file_name+".xml" 
f = open('C:\\Users\\kmjn026\\Desktop\\Data_MLT\\%s'%filename, 'wb') 

for elm in (tree.findall('Document')): 
    text = ET.tostring(elm) 

    if i % per_file == 0 and i > 0: 
     file_counter += 1 
     f.write(("</"+ "%s"%root+">")) 
     f.close() 
     filename = "%d"%file_counter+"_of_%s"%file_name+".xml" 
     f = open('C:\\Users\\kmjn026\\Desktop\\Data_MLT\\%s'%filename, 'wb') 
     f.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") 
     f.write(("<"+ "%s"%root+">")) 


    f.write(text) 
    i += 1 

f.write(("</"+ "%s"%root+">")) 
f.close()