Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AttributeError: type object 'ElementTree' has no attribute 'tostring'

I have this problem , AttributeError: type object 'ElementTree' has no attribute 'tostring', I don't know what's is wrong, I import to string, It does not work. Try to follow another tutorial but, nothing.

Is there any other way to convert an ElementTree object into an XML string?

import os
import re
import glob
from xml.dom import minidom
from time import strftime
from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
date=strftime("%Y-%m-%dT%H:%M:%S")
os.chdir('/home/guillermo/TclsPy/XML_Level2/')

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = ElementTree.tostring(elem, 'utf-8',method="xml" ,     short_empty_elements=True)
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent=" ")





for nameXml in glob.glob("*.xml"):
    new_nameXml = re.sub(r'tlmy',r'AUX',nameXml,flags=re.IGNORECASE)
    new_nameXml = re.sub('.xml','_AlarmEnabled.xml',new_nameXml, flags=re.IGNORECASE)#new_nameXml.lower().replace('.xml','_AlarmEnabled.xml')
    match = re.search(r'TSL_TM_TLMY_(.+).xml', nameXml,flags= re.IGNORECASE )
    if match:
        #Si matchea el patron, guardamos en subsistema lo que esta entre ()
        subsistema = match.group(1)
        print "Nombre:", new_nameXml
        print "Subsistema:", subsistema
    else:
        print "No matchea:", nameXml
       # raw_input()
    #<?xml version="1.0" encoding="UTF-8"?>
    TSLFunction=Element('TSLFunction')
    child = SubElement(TSLFunction, 'unit')
    child.text = '<![CDATA[AUX]]>'

    child1= SubElement(TSLFunction,'mnemonic')
    child1.text='<![CDATA'+'['+'AUX::'+'AUX.'+subsistema.replace('.xml','')+'_AlarmEnabled]]'

    child2=SubElement(TSLFunction, 'body')
    child2.text='<![CDATA[out = true;]]>'

    child3=SubElement(TSLFunction,'description')
    child3.text='<![CDATA[--]]>'

    child4=SubElement(TSLFunction,'name')
    child4.text='<![CDATA['+subsistema+'_AlarmEnabled'+']]'

    child5=SubElement(TSLFunction,'minorVersion')
    child5.text='0'

    child6=SubElement(TSLFunction,'majorVersion')
    child6.text='1'

    child7=SubElement(TSLFunction,'lastUpdate')
    child7.text=date

    child8=SubElement(TSLFunction,'creationDate')
    child8.text=date

    child9=SubElement(TSLFunction,'checked')
    child9.text='false'

    returnchild=SubElement(TSLFunction,'return')


    name=SubElement(returnchild,'name')
    name.text='<![CDATA[out]]>'

    returnType=SubElement(returnchild,'returnType')
    returnType.text='boolean'
    label=SubElement(returnchild,'label')
    label.text='<![CDATA[--]]>'

    parameters=SubElement(TSLFunction,'parameters')

    subtype=SubElement(TSLFunction,'subtype')
    subtype.text='<![CDATA[TM]]>'

    prefix=SubElement(TSLFunction,'prefix')
    prefix.text='<![CDATA[AUX]]>'

    variable=SubElement(TSLFunction,'variable')
    variable.text='<![CDATA['+subsistema +'_AlarmEnabled]]'
    print (subsistema)

    tree = ElementTree(prettify(TSLFunction))
    tree.write('../Alarm/'+new_nameXml)enter code here
like image 210
Guillermo Avatar asked Sep 20 '13 14:09

Guillermo


2 Answers

The xml.etree.ElementTree.ElementTree class does not have a tostring method. It is a function in the xml.etree.ElementTree module.

You have imported tostring from the module already in your code. Change

rough_string = ElementTree.tostring(elem, 'utf-8', method="xml", short_empty_elements=True)

to

rough_string = tostring(elem, 'utf-8', method="xml")

and it should work.

The short_empty_elements parameter is only available in Python 3.4. It does not work in Python 2.7.

like image 103
mzjn Avatar answered Oct 24 '22 10:10

mzjn


You're importing the wrong thing. tostring is a function in the xml.etree.ElementTree module, not a method of xml.etree.ElementTree.ElementTree.

like image 23
Wooble Avatar answered Oct 24 '22 08:10

Wooble