Это потому, что вы назначаете значение food
дважды. Первый раз на уровне файлов:
food = Food(RED,rectangle_width,rectangle_height)
Это нормально, и ваш код, вероятно, сработает, если вы не во второй раз устанавливаете food
в своем event_loop
. ]:
food = True
После этого вызова food является логическим значением, и, следовательно, вы получаете ошибку, которая говорит о том, что bools не имеет свойства rect
.
Уберите это второе назначение, и оно должно решить проблему.
xml.etree.cElementTree, включенный в распределение по умолчанию CPython с тех пор 2.5. Молния быстро и для чтения и для записи XML.
Я думаю, что Вы найдете, что XMLGenerator от xml.sax.saxutils является самой близкой вещью к тому, что Вы хотите.
import time from xml.sax.saxutils import XMLGenerator from xml.sax.xmlreader import AttributesNSImpl LOG_LEVELS = ['DEBUG', 'WARNING', 'ERROR'] class xml_logger: def __init__(self, output, encoding): """ Set up a logger object, which takes SAX events and outputs an XML log file """ logger = XMLGenerator(output, encoding) logger.startDocument() attrs = AttributesNSImpl({}, {}) logger.startElementNS((None, u'log'), u'log', attrs) self._logger = logger self._output = output self._encoding = encoding return def write_entry(self, level, msg): """ Write a log entry to the logger level - the level of the entry msg - the text of the entry. Must be a Unicode object """ #Note: in a real application, I would use ISO 8601 for the date #asctime used here for simplicity now = time.asctime(time.localtime()) attr_vals = { (None, u'date'): now, (None, u'level'): LOG_LEVELS[level], } attr_qnames = { (None, u'date'): u'date', (None, u'level'): u'level', } attrs = AttributesNSImpl(attr_vals, attr_qnames) self._logger.startElementNS((None, u'entry'), u'entry', attrs) self._logger.characters(msg) self._logger.endElementNS((None, u'entry'), u'entry') return def close(self): """ Clean up the logger object """ self._logger.endElementNS((None, u'log'), u'log') self._logger.endDocument() return if __name__ == "__main__": #Test it out import sys xl = xml_logger(sys.stdout, 'utf-8') xl.write_entry(2, u"Vanilla log entry") xl.close()
Вы, вероятно, захотите посмотреть на остальную часть статьи, от которой я получил это в http://www.xml.com/pub/a/2003/03/12/py-xml.html .
Несколько лет назад я использовал MarkupWriter
от 4suite
General-purpose utility class for generating XML (may eventually be expanded to produce more output types) Sample usage: from Ft.Xml import MarkupWriter writer = MarkupWriter(indent=u"yes") writer.startDocument() writer.startElement(u'xsa') writer.startElement(u'vendor') #Element with simple text (#PCDATA) content writer.simpleElement(u'name', content=u'Centigrade systems') #Note writer.text(content) still works writer.simpleElement(u'email', content=u"info@centigrade.bogus") writer.endElement(u'vendor') #Element with an attribute writer.startElement(u'product', attributes={u'id': u"100\u00B0"}) #Note writer.attribute(name, value, namespace=None) still works writer.simpleElement(u'name', content=u"100\u00B0 Server") #XML fragment writer.xmlFragment('<version>1.0</version><last-release>20030401</last-release>') #Empty element writer.simpleElement(u'changes') writer.endElement(u'product') writer.endElement(u'xsa') writer.endDocument() Note on the difference between 4Suite writers and printers Writer - module that exposes a broad public API for building output bit by bit Printer - module that simply takes a DOM and creates output from it as a whole, within one API invokation
Недавно, я слышу много о том, как lxml является большим, но у меня нет собственного опыта, и у меня была некоторая забава, работающая с gnosis.
Второе голосование за ElementTree (cElementTree внедрение C, которое немного быстрее, как cPickle по сравнению с рассолом). Существует некоторый короткий пример кода здесь, что можно посмотреть на дать Вам общее представление о том, как он работает: http://effbot.org/zone/element-index.htm (это - Fredrik Lundh, который записал модуль во-первых. Настолько хорошо, что это было проектировано в стандартную библиотеку с 2,5 :-))
У меня всегда были хорошие результаты с lxml. Это - боль для установки, как это - главным образом обертка приблизительно libxml2, но lxml.etree
древовидные объекты имеют .write()
метод, который берет подобный файлу объект передать потоком к.
from lxml.etree import XML
tree = XML('<root><a><b/></a></root>')
tree.write(your_file_object)