您当前的位置:首页 > 深入 Python > 脚本和流 > 按节点类型创建单独的处理程序 | << >> | ||||
深入 Python从 Python 新手到专家 |
第三个有用的 XML 处理技巧是根据节点类型和元素名称将代码分离到逻辑函数中。解析后的 XML 文档由各种类型的节点组成,每个节点都由一个 Python 对象表示。文档本身的根级别由 Document 对象表示。 Document 对象包含一个或多个 Element 对象(用于实际的 XML 标签),每个 Element 对象可以包含其他 Element 对象、Text 对象(用于文本片段)或 Comment 对象(用于嵌入式注释)。 Python 可以轻松编写调度程序来分离每种节点类型的逻辑。
>>> from xml.dom import minidom >>> xmldoc = minidom.parse('kant.xml')>>> xmldoc <xml.dom.minidom.Document instance at 0x01359DE8> >>> xmldoc.__class__
<class xml.dom.minidom.Document at 0x01105D40> >>> xmldoc.__class__.__name__
'Document'
![]() |
假设 kant.xml 位于当前目录中。 |
![]() |
正如您在第 9.2 节“包”中看到的,解析 XML 文档返回的对象是一个 Document 对象,该对象在 xml.dom 包的 minidom.py 中定义。正如您在第 5.4 节“实例化类”中看到的,__class__ 是每个 Python 对象的内置属性。 |
![]() |
此外,__name__ 是每个 Python 类的内置属性,它是一个字符串。这个字符串并不神秘;它与您自己定义类时键入的类名相同。(请参阅第 5.3 节“定义类”。) |
好的,现在您可以获取任何特定 XML 节点的类名(因为每个 XML 节点都表示为一个 Python 对象)。如何利用这一点来分离解析每种节点类型的逻辑?答案是 getattr,您在第 4.4 节“使用 getattr 获取对象引用”中第一次看到它。
def parse(self, node): parseMethod = getattr(self, "parse_%s" % node.__class__.__name__)![]()
parseMethod(node)
def parse_Document(self, node):self.parse(node.documentElement) def parse_Text(self, node):
text = node.data if self.capitalizeNextWord: self.pieces.append(text[0].upper()) self.pieces.append(text[1:]) self.capitalizeNextWord = 0 else: self.pieces.append(text) def parse_Comment(self, node):
pass def parse_Element(self, node):
handlerMethod = getattr(self, "do_%s" % node.tagName) handlerMethod(node)
在本例中,调度函数 parse 和 parse_Element 只是在同一个类中查找其他方法。如果您的处理非常复杂(或者您有许多不同的标签名称),您可以将代码分解成单独的模块,并使用动态导入来导入每个模块并调用您需要的任何函数。动态导入将在第 16 章“函数式编程”中讨论。
<< 查找节点的直接子节点 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
处理命令行参数 >> |