一直以来都是用xml.dom.minidom来解析xml的。
重点关注一下nodeType。
nodeType是结点的类型,现在有以下几种:
'ATTRIBUTE_NODE'
'CDATA_SECTION_NODE'
'COMMENT_NODE'
'DOCUMENT_FRAGMENT_NODE'
'DOCUMENT_NODE'
'DOCUMENT_TYPE_NODE'
'ELEMENT_NODE'
'ENTITY_NODE'
'ENTITY_REFERENCE_NODE'
'NOTATION_NODE'
'PROCESSING_INSTRUCTION_NODE'
'TEXT_NODE'
这些结点通过名字很好理解。
其中'CDATA_SECTION_NODE'是CDATA节点。在xml中,CDATA是为了防止特殊符号影响xml而设计的。
下面贴两段pybatis研发中的代码供minidom的参考。
def handleOneSqlMapFile(sqlmapFilePath): dom = xml.dom.minidom.parse(sqlmapFilePath) sqlmaproot = dom.documentElement #=============================================================================== # 处理namespace属性。根据namespace属性,放置到一个列表中,供用数据反射生成对象的时候使用 #=============================================================================== parseNameSpace(sqlmaproot) #=============================================================================== # 先处理typeAlias。找到所有的typeAlias节点 #=============================================================================== typeAliasElements = sqlmaproot.getElementsByTagName("typeAlias") parseTypeAlias(typeAliasElements, sqlmapFilePath) #=============================================================================== # 找到select节点 #=============================================================================== selectsElements = sqlmaproot.getElementsByTagName("select") parseSelectXMLNode(selectsElements, sqlmapFilePath) #=============================================================================== # update #=============================================================================== updateElements = sqlmaproot.getElementsByTagName("update") parseUpdateXMLNode(updateElements, sqlmapFilePath) #=============================================================================== # 找到insert节点 #=============================================================================== insertElements = sqlmaproot.getElementsByTagName("insert") parseInsertXMLNode(insertElements, sqlmapFilePath) #=============================================================================== # 找到delete节点 #=============================================================================== deleteElements = sqlmaproot.getElementsByTagName("delete") parseDeleteXMLNode(deleteElements, sqlmapFilePath) def parseSqlMapConfig(filepath): dom = xml.dom.minidom.parse(filepath) root = dom.documentElement #=============================================================================== # 处理数据库连接池和事务管理 #=============================================================================== tmelement = root.getElementsByTagName('transactionManager') if len(tmelement) > 1: raise Exception('multi transactionManager found.') parseTransactionManagerAndDBSource(tmelement) #=========================================================================== # 找到所有的映射文件 #=========================================================================== sqlmaps = root.getElementsByTagName('sqlMap') for sqlmap in sqlmaps: #======================================================================= # 找到sqlmap文件 #======================================================================= sqlmapfilepath = get_attrvalue(sqlmap, 'resource') #======================================================================= # 处理这个sqlmap文件 #======================================================================= handleOneSqlMapFile(sqlmapfilepath)
这两段代码是处理pybatis配置文件的。