从Python中拉出XML部分

时间:2016-07-27 16:50:57

标签: python xml

请注意,我有一些Python经验,但没有很多深刻的经验,所以请耐心等待。

我有一个非常大的XML文件,大约100兆,有很多很多部分和子部分。我需要拉出某种类型的每个子部分(这种类型有很多)并将每个子部分写入不同的文件。我可以处理的文字,但我正在盯着ElementTree文档试图弄清楚如何遍历树,找到一个以这种方式声明的元素,只抽出那些标签之间的数据并处理它,然后继续向下移动文件。

结构类似于此(略微混淆)。我想要做的是单独拉出标有“数据”的每个部分。

<filename>
    <config>
        <collections>   
        <datas>
            <data>
            ...
            </data>
            <data>
            ...
            </data>
            <data>
            ...
            </data>
        </datas>
        </collections>
     </config>
</filename>

2 个答案:

答案 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的第三方模块XSLTlxml解决方案。具体来说,您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()