2017-10-09 80 views
0

我有一个如图所示的xml文件。在xml文件中一次遍历固定数量的元素。 python元素树

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

我的要求是该XML分裂为较小的XML文件具有固定数目在每个文件<Data>元件。 我可以将每个<Data>分割为一个xml,但无法获取固定数量的<Data>元素并形成文件。

我的输出是: 文件1:

<DataRoot> 
    <Data> 
</DataRoot> 

文件2:

<DataRoot> 
    <Data> 
</DataRoot> 

但所需的输出是:

文件1:

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

文件2:

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

这里是我的代码。

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

中形成的文件数是不是两个,这取决于源XML文档的大小,说明我已经给了一个随机数作为2 预先感谢

回答

0

只需添加一个计数器并检查何时去下一个文件:

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