现在的位置: 首页 > 综合 > 正文

用Python去解析XML报文 V1.1

2013年10月04日 ⁄ 综合 ⁄ 共 9987字 ⁄ 字号 评论关闭
演示如何用Python解析XML。
如下分别是待解析的XML报文,尾部是Python 源码。
    1. <?xml version="1.0" encoding="iso8859-1"?>
    2. <view id="CCBSA_v" msgType="1">
    3. <viewElem id="jrcfwq"  dispName="集群">
    4. <viewElem id="fwqsl" dispName="服务器数量" value="1"/>
    5. <viewElem id="Master" dispName="主控节点" value="STAR"/>
    6. <viewElem id="Server" >
    7. <viewElem id="SrvName" value="01" dispName="STAR">
    8. <viewElem id="Plat" dispName="平台信息">
    9. <viewElem id="PlatStat" dispName="平台状态">
    10. <viewElem id="MchPort" dispName="机器端口" value="12000"/>
    11. <viewElem id="MchState" dispName="机器状态" value="在线"/>
    12. <viewElem id="AllProc" dispName="总进程数" value="0"/>
    13. <viewElem id="EslProc" dispName="平台进程数" value="29"/>
    14. <viewElem id="SemNum" dispName="信号灯数" value="104"/>
    15. <viewElem id="DrqSem" dispName="DRQ使用信号灯" value="53"/>
    16. </viewElem>
    17. <viewElem id="CpuStat" dispName="CPU状态">
    18. <viewElem id="CpuIdle" dispName="idle" value="0"/>
    19. <viewElem id="CpuUser" dispName="user" value="0"/>
    20. <viewElem id="CpuNice" dispName="nice" value="0"/>
    21. <viewElem id="CpuSys" dispName="sys" value="0"/>
    22. <viewElem id="CpuWio" dispName="wio" value="0"/>
    23. </viewElem>
    24. <viewElem id="SysInfo" dispName="操作系统信息">
    25. <viewElem id="CpuNum" dispName="CPU颗数" value="0"/>
    26. <viewElem id="PhyMem" dispName="物理内存(K)" value="0"/>
    27. <viewElem id="VirtMem" dispName="虚拟内存(K)" value="0"/>
    28. <viewElem id="UsedMem" dispName="已用内存(K)" value="0"/>
    29. <viewElem id="exit_freeMem" dispName="可用内存(K)" value="0"/>
    30. <viewElem id="IFaceNum" dispName="网络接口数" value="0"/>
    31. </viewElem>
    32. <viewElem id="ProjInfo" dispName="项目信息">
    33. <viewElem id="ShmSize" dispName="部署共享内存大小(k)" value="15251168"/>
    34. <viewElem id="ShmKeep" dispName="部署共享内存剩余(k)" value="16769072"/>
    35. <viewElem id="BcbSize" dispName="交换共享内存大小(k)" value="6304"/>
    36. <viewElem id="BcbUsed" dispName="已用交换共享内存(k)" value="2208"/>
    37. <viewElem id="BcbMax" dispName="最大交换共享内存(k)" value="70816"/>
    38. <viewElem id="ChkNum" dispName="当前已用缓冲区段数" value="1"/>
    39. <viewElem id="DrqMsg" dispName="缓存消息数" value="0"/>
    40. <viewElem id="MsqNum" dispName="队列中的消息数" value="0"/>
    41. <viewElem id="TranNum" dispName="本机交易统计" value="322047"/>
    42. <viewElem id="DTAMPID" dispName="DTA管理服务进程号" value="3727372"/>
    43. <viewElem id="RCYCLPID" dispName="垃圾回收服务进程号" value="3739830"/>
    44. <viewElem id="SYNCPID" dispName="多机同步服务进程号" value="3670122"/>
    45. <viewElem id="ISSUEPID" dispName="多机发布服务进程号" value="2871348"/>
    46. <viewElem id="MACHSVRPID" dispName="多机交换服务进程号" value="0"/>
    47. <viewElem id="MONCPID" dispName="多机监控同步服务进程号" value="0"/>
    48. <viewElem id="MONSPID" dispName="多机监控发布服务进程号" value="0"/>
    49. <viewElem id="DTANUM" dispName="适配器个数" value="12"/>
    50. ....
    51. ....
    52. ......

 

 

 

  1. from xml.dom import minidom
  2. from sys import stderr
  3. from os.path import join
  4. __version__ = "V1.1"
  5. """
  6.   Definition for types and maps
  7. """
  8. dataTypMap = {"integer"0"foat"1"boolean"2,
  9.               "char"3"string"4"void"5"double"6,
  10.               "long"7"object"8"datetime"9}
  11. nodeTypMap = {"LEAF"0"NODE"2}
  12. nodeImgMap = {nodeTypMap["LEAF"]: "/images/leaf.gif",
  13.               nodeTypMap["NODE"]: "/images/node.gif"}
  14. whoMap = {"Views"0"Nodes"1,
  15.           "NodeViews"2"NodesRel"3}
  16. class TIndicatorData:  
  17.   def __init__ (self, XML, dest):
  18.     self.__xmldoc = minidom.parse (XML.strip (" "))
  19.     self.__root = self.__xmldoc.documentElement
  20.     self.__destPath = dest.strip (" ")
  21.     self.__gNodesList = []    # Storing unique nodes
  22.     self.__hViews = None      # File handle for isac_mnt_view
  23.     self.__hNodes = None      # File handle for isac_mnt_basenode
  24.     self.__hNodeViews = None  # File handle for isac_mnt_basenode_view
  25.     self.__hNodesRel = None   # File handle for isac_mnt_basenode_rel
  26.     self.__outputData = {"Views": "", "Nodes": "", "NodeViews": "", "NodesRel": ""}
  27.   # end def
  28.   def GenIndicators (self):
  29.     self.__hViews = open (join (self.__destPath, "isac_mnt_view.txt"), "w+")
  30.     self.__hNodes = open (join (self.__destPath, "isac_mnt_basenode.txt"), "w+")
  31.     self.__hNodeViews = open (join (self.__destPath, "isac_mnt_basenode_view.txt"), "w+")
  32.     self.__hNodesRel = open (join (self.__destPath, "isac_mnt_basenode_rel.txt"), "w+")
  33.     try:
  34.       self.__retrieveIndViewData ("Nodes")
  35.       self.__retrieveIndViewData ("Views")
  36.       self.__retrieveIndViewData ("NodeViews")
  37.       self.__retrieveIndViewData ("NodesRel")
  38.       self.__write (self.__hNodes, "Nodes")
  39.       self.__write (self.__hViews, "Views")
  40.       self.__write (self.__hNodeViews, "NodeViews")
  41.       self.__write (self.__hNodesRel, "NodesRel")
  42.     finally:
  43.       self.__hViews.close ()
  44.       self.__hNodes.close ()
  45.       self.__hNodeViews.close ()
  46.       self.__hNodesRel.close ()
  47.   # end def
  48.   def __write (self, fileHandle, outputDataName):
  49.     if not fileHandle:
  50.       stderr.write ("Invalid file handle corresponding to %s" % outputDataName)
  51.       return
  52.     fileHandle.write (self.__outputData[outputDataName.strip (" ")].encode ("GB2312"))
  53.     print fileHandle.name
  54.   def __retrieveIndViewData (self, whoMapKeyName):
  55.     self.__getNodes (self.__root, whoMap[whoMapKeyName])
  56.     self.__clearNodesList ()
  57.   def __clearNodesList (self):
  58.     self.__gNodesList = []
  59.   def __getNodePaths (self, ANode, isDynNode = True, initPath = ""):
  60.     """
  61.       retrieves the value of string of static nodes or dynamic nodes
  62.       exclueded leaf-nodes.
  63.     """
  64.     if (not ANode) or (not ANode.hasChildNodes ()):
  65.       return initPath
  66.     if initPath.strip (" ") == "":
  67.       initPath = "/%s" % ANode.attributes["id"].value.strip (" ")
  68.       
  69.     for elem in ANode.childNodes:
  70.       if (not elem.localName) or (not elem.hasChildNodes ()):
  71.         continue
  72.       
  73.       idPath = ""    
  74.       if isDynNode and elem.hasAttribute ("value"):
  75.         idPath = "%s/%s" % (initPath, elem.attributes["value"].value.strip (" "))
  76.       else:
  77.         idPath = "%s/%s" % (initPath, elem.attributes["id"].value.strip (" "))      
  78.       print idPath
  79.       self.__getNodePaths (elem, isDynNode, idPath)
  80.     # end for
  81.   # end def
  82.   def __getNodeType (self, ANode):
  83.     ret = nodeTypMap["LEAF"]
  84.     if ANode.hasChildNodes ():
  85.       ret = nodeTypMap["NODE"]
  86.     return ret
  87.   # end def
  88.   def __outputNodes (self, ANode):
  89.     """
  90.       generates the records of unique nodes in XML
  91.     """
  92.     if not ANode:
  93.       return
  94.     
  95.     nodeType = self.__getNodeType (ANode)
  96.     dataType = dataTypMap["void"]
  97.     if nodeType == nodeTypMap["LEAF"and ANode.hasAttribute ("value"):
  98.       dataValue = ANode.attributes["value"].value.strip (" ")
  99.       if dataValue.isdigit ():
  100.         dataType = dataTypMap["integer"]
  101.       else:
  102.         try:
  103.           float (dataValue)
  104.           dataType = dataTypMap["float"]
  105.         except:
  106.           dataType = dataTypMap["string"]
  107.     dispName = ANode.attributes["id"].value.strip (" ")
  108.     if ANode.hasAttribute ("dispName"):
  109.       dispName = ANode.attributes["dispName"].value.strip (" ") /
  110.                  .encode ("ISO8859").decode ("GB2312")                
  111.     ProcType = 0
  112.     PrstType = 1
  113.     UnitName = ' '
  114.     initValue = '0'
  115.     updateTime = ' '
  116.     self.__outputData["Nodes"] += "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|/n" % /
  117.                                   (ANode.attributes["id"].value.strip (" "),
  118.                                    dispName, dispName, nodeImgMap[nodeType],
  119.                                    nodeType, dataType, ProcType, PrstType,
  120.                                    UnitName, initValue, updateTime)
  121.   # end def
  122.   def __outputViews (self, ANode):
  123.     """
  124.       generates the records of views.
  125.     """
  126.     if (not ANode) or (self.__getNodeType (ANode) != nodeTypMap["NODE"]):
  127.       return
  128.     nodeID = ANode.attributes["id"].value.strip (" ")
  129.     viewName = nodeID
  130.     if ANode.hasAttribute ("dispName"):
  131.       viewName = ANode.attributes["dispName"].value /
  132.                  .encode ("ISO8859").decode ("GB2312")
  133.     
  134.     self.__outputData["Views"] += "%s|%s|%s|/n" % (nodeID, viewName, nodeID)
  135.     
  136.   # end def
  137.   def __outputNodeViews (self, ANode):
  138.     if not ANode:
  139.       return
  140.     
  141.     if self.__getNodeType (ANode) == nodeTypMap["NODE"]:
  142.       self.__outputData["NodeViews"] += /
  143.                                      "%s|%s|/n" % /
  144.                                      (ANode.attributes["id"].value.strip (" "),
  145.                                       ANode.attributes["id"].value.strip (" "))
  146.     else:
  147.       self.__outputData["NodeViews"] += /
  148.                                      "%s|%s|/n" % /
  149.                                      (ANode.attributes["id"].value.strip (" "),
  150.                                       ANode.parentNode.attributes["id"].value.strip (" "))
  151.   # end def
  152.   def __outputNodesRel (self, ANode):
  153.     if (not ANode) or (ANode.parentNode.nodeType == ANode.DOCUMENT_NODE):
  154.       return
  155.     self.__outputData["NodesRel"] += "%s|%s|/n" % /
  156.                                      (ANode.parentNode.attributes["id"].value.strip (" "),
  157.                                       ANode.attributes["id"].value.strip (" "))
  158.   # end def
  159.   def __handleByType (self, ANode, Who):
  160.     """
  161.       Determine which kind of data should be output.
  162.     """
  163.     if not ANode:
  164.       return
  165.     
  166.     if Who == whoMap["Nodes"]:
  167.       self.__outputNodes (ANode)
  168.     elif Who == whoMap["Views"]:
  169.       self.__outputViews (ANode)
  170.     elif Who == whoMap["NodeViews"]:
  171.       self.__outputNodeViews (ANode)
  172.     elif Who == whoMap["NodesRel"]:
  173.       self.__outputNodesRel (ANode)
  174.   # end def
  175.   def __getNodes (self, ANode, Who):
  176.     """ retrieves all static nodes """
  177.     if not ANode:
  178.       return
  179.     
  180.     if ANode.parentNode.nodeType == ANode.DOCUMENT_NODE:
  181.       self.__handleByType (ANode, Who)
  182.     for elem in ANode.childNodes:
  183.       if not elem.localName:
  184.         continue
  185.       if not elem.hasAttribute ("id"):
  186.         stderr.write ("Invalid tag without an attribute named 'id' FOUND!")
  187.         continue
  188.       tagID = elem.attributes["id"].value.strip (" ")
  189.       try:      
  190.         self.__gNodesList.index (tagID)
  191.         continue    
  192.       except ValueError:
  193.         # NOT FOUND
  194.         self.__gNodesList.append (tagID)
  195.       self.__handleByType (elem, Who)
  196.       self.__getNodes (elem, Who)
  197.   # end def
  198. # end class
  199. if __name__ == "__main__":
  200.   """
  201.     CAUTION: Please set encoding by ISO8859 in XML head!
  202.   """
  203.   ind = TIndicatorData (
  204.     r"D:/Documents/Construction_Bank/SH/CCBSA/Design/ccbsa_ind21.xml",
  205.     r"D:/Temp")
  206.   ind.GenIndicators ()
  207.   print "/nMISSION COMPLETED."
  208. # END OF FILE.

抱歉!评论已关闭.