用于XML解析的Python元编程

用于XML解析的Python元编程,python,xml,metaprogramming,Python,Xml,Metaprogramming,我试图创建一个简单的XML解析器,其中每个不同的XML模式都有自己的解析器类,但我不知道最好的方法是什么。实际上我想做的是这样的: in = sys.stdin xmldoc = minidom.parse(in).documentElement xmlParser = xmldoc.nodeName parser = xmlParser() out = parser.parse(xmldoc) 我也不太确定是否正确获取了文档根名称,但这就是想法:创建一个类的对象,该类的名称与文档根类似,并

我试图创建一个简单的XML解析器,其中每个不同的XML模式都有自己的解析器类,但我不知道最好的方法是什么。实际上我想做的是这样的:

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

xmlParser = xmldoc.nodeName
parser = xmlParser()
out = parser.parse(xmldoc)
我也不太确定是否正确获取了文档根名称,但这就是想法:创建一个类的对象,该类的名称与文档根类似,并使用该类中的parse()函数来解析和处理输入


实现这一目标的最简单方法是什么?我一直在读关于内省和模板的书,但还没有弄明白这一点。我在过去用Java做过类似的事情,而且AFAIK、Ruby也使这变得简单。pythonian的方式是什么?

我认为大多数python程序员只会使用它来解析他们的xml。如果你仍然想在课堂上总结,你可以,但正如德尔南在评论中所说,你真正的意思有点不清楚

from lxml import etree

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

另外,如果其他程序员正在阅读您的代码,您至少应该大致遵循PEP8。但更重要的是,您确实不应该像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中包装调用…除非或将第三个参数传递给getattr,如果找不到该属性,将返回该参数。

如果没有详细信息,这个问题毫无价值。“解析”是指“从DOM中提取数据”吗?还是要从头开始构建整个XML解析器?或者你是说验证器。。。?这有什么关系?我希望能够基于XML文件的文档根名称调用Python类。我认为这与我在这些类中要做什么无关。这只是一个简单的测试服务器,脚本在其中接收XML文件并返回一些内容。我想我应该让它更聪明一点,这样就可以很容易地为每个模式接收的xml添加更多测试(有效性检查等)(也就是说,我可以检查xml文件是否正确)。我的计划是让解析器以根文档命名,但这已经超出了重点,因为我对问题的反射/内省部分更感兴趣。也就是说,如果我们将对象的名称作为字符串,是否可以创建一个对象?如果您知道一个现有类的名称,那么实例化它很简单。您可以只使用parser\u class=getattr(模块,类名称)。我想这就是你想要的。如果您想基于字符串名动态生成一个类,您实际上可以这样做,但我认为这不是您想要的。