2016-08-15 4 views
-1

私はXMLデータをzipに書きます。zipファイルを作成します。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でなく、2番目に輸入品(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() 
関連する問題