我正在尝试创建一个简单的 XML 解析器,其中每个不同的 XML 模式都有它自己的解析器类,但我不知道最好的方法是什么。我实际上想做的是这样的:
in = sys.stdin
xmldoc = minidom.parse(in).documentElement
xmlParser = xmldoc.nodeName
parser = xmlParser()
out = parser.parse(xmldoc)
我也不太确定是否正确获取文档根名称,但这就是想法:创建一个与文档根名称相似的类的对象,并使用该类中的 parse() 函数来解析和处理输入。
实现这一目标的最简单方法是什么?我一直在阅读有关内省(introspection)和模板的内容,但尚未弄清楚这一点。我过去用 Java 做过类似的事情,据我所知,Ruby 也让这件事变得简单。 python 方式是什么?
最佳答案
正如 Mark 在评论中所指出的,要获取对运行时知道名称的类的引用,可以使用 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 将返回 AttributeError,因此您可以将调用包装在 try... except 中,或者将第三个参数传递给 getattr,如果找不到属性,则将返回第三个参数。
关于用于 XML 解析的 Python 元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3618246/