一直以来都是用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配置文件的。