2016-08-15 89 views
-1

我正在寫一個XML數據到zip。創建zipfile:TypeError:類型'ElementTree'的對象沒有len()

from xml.etree.ElementTree import Element, SubElement, ElementTree 
from zipfile import ZipFile 

def create_tree(): 
    root = Element("root") 
    doc = SubElement(root, "doc") 
    SubElement(doc, "field", name="blah").text = "text" 

    return ElementTree(root) 


def test(): 
    """ 
    Create zip 
    """ 
    with ZipFile("xml.zip", 'w') as ziparc: 
     element_tree = create_tree() 
     ziparc.writestr("file.xml", element_tree) 


if __name__ == "__main__": 
    test() 

錯誤:

File "main_test2_2.py", line 168, in test 
    ziparc.writestr('file.xml', element_tree) 
    File "/usr/lib/python2.7/zipfile.py", line 1127, in writestr 
    zinfo.file_size = len(bytes)   # Uncompressed size 
TypeError: object of type 'ElementTree' has no len() 

請告訴我,我怎麼可以將XML數據寫入到歸檔?

回答

1

寫的元素放入一個假文件(緩衝區)

from xml.etree.ElementTree import Element, SubElement, ElementTree 
from zipfile import ZipFile 
from io import BytesIO 

def create_tree(): 
    root = Element("root") 
    doc = SubElement(root, "doc") 
    SubElement(doc, "field", name="blah").text = "text" 

    return ElementTree(root) 


def test(): 
    """ 
    Create zip 
    """ 
    with ZipFile("xml.zip", 'w') as ziparc: 
     element_tree = create_tree() 
     outbuf = BytesIO() 
     element_tree.write(outbuf) 
     ziparc.writestr("file.xml", outbuf.getvalue()) 


if __name__ == "__main__": 
    test() 

編輯:另一個用戶試圖表明tostring方法,但它並沒有完成&沒有可能的工作,因爲第一個參數必須是一個Element不是ElementTree,其次是因爲進口(ElementTree是一個包裝和一個子類別,因此存在歧義)。

但是,我修改了完整的源代碼,它也適用,我認爲它甚至更好的解決方案(歡呼誰刪除了他的留言本等用戶!)

from xml.etree.ElementTree import Element, SubElement 
from zipfile import ZipFile 
import xml.etree.ElementTree 

def create_tree(): 
    root = Element("root") 
    doc = SubElement(root, "doc") 
    SubElement(doc, "field", name="blah").text = "text" 

    return root 


def test(): 
    """ 
    Create zip 
    """ 
    with ZipFile("xml.zip", 'w') as ziparc: 
     element_tree = create_tree() 

     ziparc.writestr("file.xml", xml.etree.ElementTree.tostring(element_tree)) 


if __name__ == "__main__": 
    test() 
相關問題