/ / Питон метапрограмиране за XML парс - python, xml, метапрограмиране

Метапрограмиране на Python за синхронизиране на XML - python, xml, metaprogramming

Опитвам се да създам прост XML парсер, къдетовсяка различна XML схема има свой собствен клас на синтактичен анализатор, но не мога да разбера какво е най-добрият начин. Това, което всъщност бих искал да направя, е нещо подобно:

in = sys.stdin
xmldoc = minidom.parse(in).documentElement

xmlParser = xmldoc.nodeName
parser = xmlParser()
out = parser.parse(xmldoc)

Аз също не съм съвсем сигурен дали получа документакоренно име правилно, но това е идеята: да създадете обект от клас с подобно име на корените на документа и да използвате функцията parse () в този клас, за да анализирате и управлявате входния сигнал.

Какво би било най-простият начин да се постигне това? Прочетох за интроспекция и шаблони, но още не успях да разбера това. Направих подобно нещо с Java в миналото и AFAIK, Ruby също прави това просто. Какъв е питонският начин?

Отговори:

1 за отговор № 1

Както отбелязва Марк в неговия коментар, за да получите позоваване на клас, който познавате с името по време на изпълнение, използвате getattr.

doc = minidom.parse(sys.stdin)
# is equivalent to
doc = getattr(minidom, "parse")(sys.stdin)

По-долу е коригирана версия на вашия псевдо-код.

from xml.dom import minidom
import sys
import myParsers # a module containing your parsers

xmldoc = minidom.parse(sys.stdin).documentElement

myParserName = xmldoc.nodeName
myParserClass = getattr(myParsers, myParserName)
# create an instance of myParserClass by calling it with the documentElement
parser = myParserClass(xmldoc)
# do whatever you want with the instance of your parser class
output = parser.generateOutput()

getattr ще върне Атрибут на грешка, акоатрибут не съществува, така че можете да приключите разговора в опит ... с изключение или да преминете трети аргумент към getattr, който ще бъде върнат, ако атрибутът не е намерен.


1 за отговор № 2

Мисля, че повечето питонови програмисти биха използвали lxml да анализират техните xml. Ако все още искате да обгърнете това в класове, можете, но както е казал Делнан в неговия коментар, това е малко неясно какво наистина имате предвид.

from lxml import etree

tree = etree.parse("my_doc.xml")
for element in tree.getroot():
...

Няколко странични бележки, ако има други програмистище четете кода, трябва да се опитате поне грубо да следват PEP 8. По-важното е обаче, че наистина не трябва да "възлагате" на вградени като "in".