2016-08-15 85 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() 
相关问题