Я бы не стал искать конечный автомат для обработки XML. Я думаю, что обычный способ сделать это - использовать стек:
class TrackInfoHandler(object):
def __init__(self):
self._stack=[]
## ================================== Event callbacks
def startElement(self, name, attrs):
cls = self.elementClasses[name]
self._stack.append(cls(**attrs))
def characters(self, ch):
self._stack[-1].addCharacters(ch)
def endElement(self, name):
e = self._stack.pop()
e.close()
if self._stack:
self._stack[-1].addElement(e)
Для каждого типа элемента вам нужен класс, который поддерживает методы addCharacters
, addElement
и close
.
РЕДАКТИРОВАТЬ: Чтобы уточнить, да, я имею в виду утверждать, что конечные автоматы, как правило, неправильный ответ, что как метод программирования общего назначения они мусор, и вы должны держаться подальше.
Есть несколько действительно хорошо понятных, четко очерченных проблем, для которых автоматы являются хорошим решением. lex
, например, это хороший материал.
Тем не менее, ФСМ обычно не справляются с изменениями. Предположим, когда-нибудь вы захотите добавить немного состояния, возможно, «мы уже видели элемент X?» флаг. В приведенном выше коде вы добавляете логический атрибут к соответствующему классу элементов, и все готово. В конечном автомате вы удваиваете количество состояний и переходов.
Проблемы, для которых сначала требуется конечное состояние, очень часто эволюционируют, требуя еще большего состояния, например, возможно, число , и в этот момент ваша схема FSM является здравой, или, что еще хуже, вы превращаете ее в какой-то вид обобщенный конечный автомат, и в этот момент вы действительно в беде. Чем дальше вы продвигаетесь, тем больше ваши правила начинают действовать как код, но код на медленном интерпретируемом вами языке, который вы изобрели, которого никто не знает, для которого нет отладчика и инструментов.