在 xml 文件中一次遍历固定数量的元素。 python 元素树
iterating through fixed number of elements, at a time in an xml file. python Element tree
我有一个 xml 文件,如图所示。
<?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 个。
提前致谢
只需添加一个计数器并检查何时转到下一个文件:
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()
我有一个 xml 文件,如图所示。
<?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 个。 提前致谢
只需添加一个计数器并检查何时转到下一个文件:
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()