Python /编程初学者。致力于从XML解析/提取数据。
目标:获取格式错误的xml(一个.data文件中的多个xml文件)并将其写入单个xml文件。仅供参考 - 每个xml以文件中的相同声明开头,总共有4个。
方法(1)我在文件上使用readlines()(2)找到每个xml声明的索引(3)循环遍历xml列表切片,将每一行写入文件。下面的代码,如果它糟透了道歉:)
For i, x in enumerate(decl_indxs):
xml_file = open(file, 'w')
if i == 4:
for line in file_lines[x:]:
xml_file.write(line)
else:
for line in file_lines[x:decl_indxs[i+1]]:
xml_file.write(line)
问题创建的前3个xmls没有问题。第4个xml仅写入396行中的前238个。
疑难解答我修改了代码以打印出用于最终循环的列表切片,这很好。我还通过第四个列表切片循环,它输出正确。
帮助任何人都可以解释为什么会这样吗?获得改善我的方法的建议也很棒。信息越多越好。谢谢
答案 0 :(得分:0)
我不认为你找到索引的方法是好的,很可能你搞砸了索引。好消息是,它实际上并不容易调试,因为有很多无意义的整数值。我会尝试在这里为你提供一些有用的方法。
据我所知,你需要
with
上下文管理器打开包含多个XML的原始文件。<?xml
,将原始文件的内容拆分为多个字符串变量。with
上下文管理器将单个XML有效字符串写入单个文件。xml.etree
,lxml
),而不是像字符串那样使用它们。代码示例:
def split_to_several_xmls(original_file_path):
# assuming that original source is correctly formatted, i.e. each line starts with "<" (omitting spaces)
# otherwise you need to parse by chars not by lines
with open(original_file_path) as f:
data = f.read()
resulting_lists = []
for line in data.split('\n'):
if not line or not line.strip(): # ignore empty lines
continue
if line.strip().startswith('<?xml '):
resulting_lists.append([]) # create new list to write lines to new xml chunk
if not resulting_lists: # ignore everything before first xml decalartion
continue
resulting_lists[-1].append(line) # write current line to current xml chunk
resulting_strings = ['\n'.join(e) for e in resulting_lists]
# i.e. backwardly convert lines to strings - each one string is one valid xml chunk in the result
return resulting_strings
def save_xmls(xml_strings, filename_base):
for i, xml_string in enumerate(xml_strings):
filename = '{base}{i}.xml'.format(base=filename_base, i=i)
with open(filename, mode='w') as f:
f.write(xml_string)
def main():
xml_strings = split_to_several_xmls('original.txt') # file with multiple xmls in one file
save_xmls(xml_strings, 'result')
if __name__ == '__main__':
main()