代码之家  ›  专栏  ›  技术社区  ›  Makis

用于XML解析的Python元编程

  •  1
  • Makis  · 技术社区  · 14 年前

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

    in = sys.stdin
    xmldoc = minidom.parse(in).documentElement
    
    xmlParser = xmldoc.nodeName
    parser = xmlParser()
    out = parser.parse(xmldoc)
    

    2 回复  |  直到 14 年前
        1
  •  1
  •   Bill the Lizard    13 年前

    正如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,如果找不到属性,将返回该参数。

        2
  •  1
  •   Mark    14 年前

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

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