在xml文件中一次迭代固定数量的元素。 python元素树

时间:2017-10-09 21:10:45

标签: python xml xml-parsing elementtree

我有一个xml文件,如图所示。

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

我的要求是将此xml拆分为每个文件中具有固定数量<Data>元素的较小xml文件。 我可以在每个<Data>拆分为xml,但无法使用固定数量的<Data>元素并形成文件。

我的输出是: 文件1:

<DataRoot>
   <Data>
</DataRoot>

file2的:

<DataRoot>
   <Data>
</DataRoot>

但必需的输出是:

文件1:

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

file2的:

<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。 提前致谢

1 个答案:

答案 0 :(得分: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()