热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用Python去解析XML报文V1.1

演示如何用Python解析XML。如下分别是待解析的XML报文,尾部是Python源码。<?xml
演示如何用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.

推荐阅读
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • C语言:(1)整数是没有小数部分的数字(2)int类型在计算机中以二进制补码形式储存。(3)早期的整形在内存中占2字节,现代计算机中大多占4字节,取&# ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
  • 接下来要动手来做一个组件了,我想了一个计数器组件,功能方面是比较简单的,但这不是本章的重点,这一章的重点是说明一个组件的制作全过程。在其中可以学到很多组件制作的技巧,当然这些也是我从书上学得的。 ... [详细]
author-avatar
手机用户2602936275
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有