2016-07-27 56 views
0

請注意,我有一些Python體驗,但沒有很多深入的體驗,請耐心等待。從Python中提取XML部分

我有一個非常大的XML文件,約100兆,有許多,許多部分和小節。我需要抽出某個類型的每個子類(並且這個類型有很多),並將每個子類寫入一個不同的文件。我可以處理的寫作,但是我盯着ElementTree文檔試圖理解如何遍歷樹,找到一個以這種方式聲明的元素,將這些標記之間的數據抽出並處理它,然後繼續下去。

結構與此類似(稍微模糊)。我想要做的是分別標出每個標有「數據」的部分。

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

回答

-1

考慮一個XSLT解決方案與Python的第三方模塊,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() 
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()