请注意,我有一些Python经验,但没有很多深刻的经验,所以请耐心等待。
我有一个非常大的XML文件,大约100兆,有很多很多部分和子部分。我需要拉出某种类型的每个子部分(这种类型有很多)并将每个子部分写入不同的文件。我可以处理的文字,但我正在盯着ElementTree文档试图弄清楚如何遍历树,找到一个以这种方式声明的元素,只抽出那些标签之间的数据并处理它,然后继续向下移动文件。
结构类似于此(略微混淆)。我想要做的是单独拉出标有“数据”的每个部分。
<filename>
<config>
<collections>
<datas>
<data>
...
</data>
<data>
...
</data>
<data>
...
</data>
</datas>
</collections>
</config>
</filename>
答案 0 :(得分:1)
我认为您可以使用data
读取每个iterparse
元素,然后将其写出来,下面只使用print
函数打印元素,但您当然可以编写它到文件:
import xml.etree.ElementTree as ET
for event, elem in ET.iterparse("input.xml"):
if elem.tag == 'data':
print(ET.tostring(elem, 'UTF-8', 'xml'))
elem.clear()
答案 1 :(得分:-1)
考虑使用Python的第三方模块XSLT的lxml
解决方案。具体来说,您xpath()
获取<data>
个节点的长度,然后迭代地构建一个动态XSLT脚本,仅针对输出的单个XML文件按节点索引[#]
解析所需的元素:
import lxml.etree as et
dom = et.parse('Input.xml')
datalen = len(dom.xpath("//data"))
for i in range(1, datalen+1):
xsltstr = '''<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="datas">
<xsl:apply-templates select="data[{0}]" />
</xsl:template>
<xsl:template match="data[{0}]">
<xsl:copy>
<xsl:copy-of select="*"/>
</xsl:copy>
</xsl:template>
</xsl:transform>'''.format(i)
xslt = et.fromstring(xsltstr)
transform = et.XSLT(xslt)
newdom = transform(dom)
tree_out = et.tostring(newdom, encoding='UTF-8', pretty_print=True,
xml_declaration=True)
xmlfile = open('Data{}.xml', 'wb')
xmlfile.write(tree_out)
xmlfile.close()