Python 如何从XML中提取n个重复标记之间的行,并一直持续到最后一个标记?

Python 如何从XML中提取n个重复标记之间的行,并一直持续到最后一个标记?,python,xmllint,Python,Xmllint,我有一个包含2500多个元素的XML文件 下面的示例显示了示例布局。我想将和之间的每一行按原样复制到一个新文件中。然后使用python从继续下一个500行,第一个解决方案是从第0行处理到最后一行,每次处理一行: nfh=None 以open('foo.xml')作为fh: num=0 对于索引,枚举中的行(fh): 如果不是索引%500: num+=1 如果是nfh: nfh.close() nfh=open('file_name{}.txt'。格式(num),'w') 写(行) 如果是nfh:

我有一个包含2500多个
元素的XML文件


下面的示例显示了示例布局。我想将
之间的每一行按原样复制到一个新文件中。然后使用python从
继续下一个500行,第一个解决方案是从第0行处理到最后一行,每次处理一行:

nfh=None
以open('foo.xml')作为fh:
num=0
对于索引,枚举中的行(fh):
如果不是索引%500:
num+=1
如果是nfh:
nfh.close()
nfh=open('file_name{}.txt'。格式(num),'w')
写(行)
如果是nfh:
nfh.close()
第二,使用lxml仅枚举XML文件中的特定标记:

将lxml.etree导入为etree
xml\u data=etree.parse('foo.xml')
nfh=无
num=0
对于索引,在enumerate(xml_data.xpath('//Item')中标记:
#列举500个标签
如果不是索引%500:
num+=1
如果是nfh:
nfh.close()
nfh=open('Output{}.XML'。格式(num),'wb')
nfh.write(etree.tostring(标记))
如果是nfh:
nfh.close()
假设您的XML更接近于此:


数据数据
数据数据
....
数据数据
....

结果是五个部分的五个文件?每行上是否只有一个标记?每行中可能有多个标记。我有兴趣复制从第一个标签到第500个结束标签的每一行。原样。您是否正在试图找出一种从某个起始位置到某个结束位置提取线条的方法?关于如何在xpath中使用“后面的兄弟姐妹”和“前面的兄弟姐妹”的信息,请查看另一个问题:后面的兄弟姐妹和前面的兄弟姐妹将跳过一些重要数据。我的目的是复制行作为一个新的文件。有没有办法让xpath在创建新文件之前识别它所处的最后一个位置,然后从该位置开始?Himanshu dua您好,感谢您的回复。你能给你的pycode添加几行注释吗?你的pycode如何识别我试图从哪个标签开始,在哪里结束?Himanshu,你能再看一遍这个问题吗?我正在处理的XML文件在标记前后都有其他数据。我只感兴趣的是在第1行和第n行之间复制行,然后从最后一行复制到下一个第n行,直到到达文件的末尾。相反,您的pycode将把任何给定的xml分块为~5个相等的部分。我说的对吗?一旦我在nfh之后为num声明了值,它就完成了请求的问题。谢谢。另外,我的原始文件包含2000多个项目标记,而解析的输出不等于足够数量的项目标记。你知道为什么吗?@Kr4t你想要每个标签还是仅仅是“物品”标签?我想要复制中间的每一行,包括提到的标签。Lxml解决方案可以做到这一点,但由于某些原因,它并不准确。当我搜索时,原始文件有2800个标记。但是,输出文件总共只包含不到1200-1300个标记。这是代码@K4rt的最新版本。你是怎么得到2800号的?
<Item name="1st"><ItemProperties>
<property>data</property><property>data</property>
</ItemProperties>
...
...
<Item name="500th"><ItemProperties>
<property>data</property><property>data</property>
</ItemProperties>
xmllint --xpath "//Item[position()<=500]" FileName.XML > Output1.XML
import xml.etree.ElementTree as ET
xml_doc = ET.parse('table.xml')
results = xml_doc.getroot()
def chunkify(lst,n):
  # Split the list into 'n' equal parts
  return [ lst[i::n] for i in xrange(n) ]

count = 1
for f in chunkify(results,5):
  temp_str = ''
  for element in f:
    temp_str = temp_str + ET.tostring(element)
  with open(str(count) +"_Output.xml", "w") as text_file:
    text_file.write(temp_str)
  count = count +1