用于 XML 解析的 Python 元编程

标签 python xml metaprogramming

我正在尝试创建一个简单的 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/

相关文章:

python - psycopg2,我应该分块提交吗?

postgresql - 尝试在 PostgreSQL 10 中选择数据时出现查询错误

java - 使用 git 时 Android studio 无法将 AndroidManifest.xml 识别为项目的一部分

java - 有没有比这段代码更优雅的方式将 XML 文档转换为 Java 中的字符串?

ruby - 从单例类中检索 Ruby 对象?

python - 在python中计算范围内的用户输入数字

python - 如何在 gitlab 管道中从 Python 连接到 redis?

xml - 使用 Xpath 比较两个 xml 字段

斯卡拉 3 : Finding functions with the given annotation

string - Julia:元编程,评估字符串到字符串的赋值?