软硬件环境

  • Ubuntu 15.10 32bit
  • Python 3.5.1
  • PyQt 5.5.1

前言

Python解析XML的方法挺多,本文主要是利用ElementTree来完成。

实例讲解

解析XML

以如下的XML文件为例

  1. <root>
  2. <version>1.0.04</version>
  3. <mysqlhost>10.10.10.240</mysqlhost>
  4. <mysqlport>3306</mysqlport>
  5. <mysqluser>root</mysqluser>
  6. <mysqlpassword>123456</mysqlpassword>
  7. <mysqldatabase>longjingdb</mysqldatabase>
  8. <mysqltable>mac</mysqltable>
  9. <mysqlstbtype>L6000</mysqlstbtype>
  10. <irdetokeytype>1</irdetokeytype>
  11. <printerhost>192.168.1.51</printerhost>
  12. <printerport>4001</printerport>
  13. </root>

编写了一个类来解析,用一个字典来存放

  1. class SYSXMLParser(object):
  2. def __init__(self,file):
  3. self.xmlFile = file
  4. self.sysXMLDict = {}
  5. def getSysXMLDict(self):
  6. tree = ET.parse(self.xmlFile)
  7. root = tree.getroot()
  8. for child in root.getchildren():
  9. self.sysXMLDict[child.tag] = child.attrib
  10. self.sysXMLDict[child.tag] = child.text
  11. return self.sysXMLDict

执行后打印的结果如下

  1. {'mysqlstbtype': 'L6000', 'mysqlpassword': '123456', 'version': '1.0.04', 'printerhost': '192.168.1.51', 'printerport': '4001', 'mysqltable': 'mac', 'mysqldatabase': 'longjingdb', 'mysqlport': '3306', 'mysqluser': 'root', 'mysqlhost': '10.10.10.240', 'irdetokeytype': '1'}

创建XML

手头上刚好有个实例,提供一个文件夹,里面是一些烧录镜像文件,针对这个镜像文件夹,需要生成一个XML文件,XML指定各个镜像文件的名字、对应烧录的地址、还有镜像的路径和md5值。

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'djstava@gmail.com'
  3. import os
  4. import sys
  5. import xml.etree.ElementTree as ET
  6. from common.constant import *
  7. from checksum.md5 import *
  8. FirstRoundImages = {'pmp.toc':PMP_ADDRESS,'secboot.toc':SECBOOT_ADDRESS,'secos.toc':SECOS_ADDRESS,'secosbak.toc':SECOS_BACK_ADDRESS,
  9. 'u-boot.toc':UBOOT_ADDRESS,'u-bootbak.toc':UBOOT_BACK_ADDRESS,'splash.dat':SPLASH_ADDRESS}
  10. SecondRoundImages = {'factorytest.img':FACTORYTEST_ADDRESS,'boot.img':BOOT_ADDRESS,'system.img':SYSTEM_ADDRESS,'dvbdata.img':DVBDATA_ADDRESS,
  11. 'userdata.img':USERDATA_ADDRESS,'cache.img':CACHE_ADDRESS,'otaloader.img':OTALOADER_ADDRESS,'iploader.img':IPLOADER_ADDRESS,
  12. 'recovery.img':RECOVERY_ADDRESS}
  13. class GenerateConfigXML(object):
  14. firstRoundImageDict = {}
  15. secondRoundImageDict = {}
  16. def __init__(self,path):
  17. self.path = path
  18. def buildConfigXML(self):
  19. '''
  20. :param path: images dir
  21. :return:
  22. '''
  23. self.listDir(self.path)
  24. root = ET.Element("root")
  25. self.firstRound = ET.SubElement(root,"FirstRound")
  26. for image in self.firstRoundImageDict.keys():
  27. if image == "pmp.toc":
  28. imagePmp = ET.SubElement(self.firstRound,image)
  29. imagePmp.set("name",image)
  30. imagePmp.set("address",self.firstRoundImageDict[image])
  31. imagePmp.set("path",os.path.relpath(self.path + "/" + image))
  32. imagePmp.set("md5",CalcMD5.calcFileMd5(self.path + "/" + image))
  33. self.firstRoundImageDict.pop(image)
  34. break
  35. for image in self.firstRoundImageDict.keys():
  36. if image == "secboot.toc":
  37. imagePmp = ET.SubElement(self.firstRound,image)
  38. imagePmp.set("name",image)
  39. imagePmp.set("address",self.firstRoundImageDict[image])
  40. imagePmp.set("path",os.path.relpath(self.path + "/" + image))
  41. imagePmp.set("md5",CalcMD5.calcFileMd5(self.path + "/" + image))
  42. self.firstRoundImageDict.pop(image)
  43. break
  44. for image in self.firstRoundImageDict.keys():
  45. if image == "secos.toc":
  46. imagePmp = ET.SubElement(self.firstRound,image)
  47. imagePmp.set("name",image)
  48. imagePmp.set("address",self.firstRoundImageDict[image])
  49. imagePmp.set("path",os.path.relpath(self.path + "/" + image))
  50. imagePmp.set("md5",CalcMD5.calcFileMd5(self.path + "/" + image))
  51. self.firstRoundImageDict.pop(image)
  52. break
  53. for image in self.firstRoundImageDict.keys():
  54. if image == "secosbak.toc":
  55. imagePmp = ET.SubElement(self.firstRound,image)
  56. imagePmp.set("name",image)
  57. imagePmp.set("address",self.firstRoundImageDict[image])
  58. imagePmp.set("path",os.path.relpath(self.path + "/" + 'secos.toc'))
  59. imagePmp.set("md5",CalcMD5.calcFileMd5(self.path + "/" + 'secos.toc'))
  60. self.firstRoundImageDict.pop(image)
  61. break
  62. for (name,address) in self.firstRoundImageDict.items():
  63. if name == "pmp.toc":
  64. continue
  65. if name == "u-bootbak.toc":
  66. imageName = ET.SubElement(self.firstRound,name)
  67. imageName.set("name",name)
  68. imageName.set("address",address)
  69. imageName.set("path",os.path.relpath(self.path + "/u-boot.toc"))
  70. imageName.set("md5",CalcMD5.calcFileMd5(self.path + "/u-boot.toc"))
  71. continue
  72. imageName = ET.SubElement(self.firstRound,name)
  73. imageName.set("name",name)
  74. imageName.set("address",address)
  75. imageName.set("path",os.path.relpath(self.path + "/" + name))
  76. imageName.set("md5",CalcMD5.calcFileMd5(self.path + "/" + name))
  77. self.secondRound = ET.SubElement(root,"SecondRound")
  78. for (name,address) in self.secondRoundImageDict.items():
  79. imageName = ET.SubElement(self.secondRound,name)
  80. imageName.set("name",name)
  81. imageName.set("address",address)
  82. imageName.set("path",os.path.relpath(self.path + "/" + name))
  83. imageName.set("md5",CalcMD5.calcFileMd5(self.path + "/" + name))
  84. tree = ET.ElementTree(root)
  85. self.indent(root)
  86. if os.path.exists(XML_CONFIG_FILE):
  87. os.remove(XML_CONFIG_FILE)
  88. tree.write("config.xml")
  89. def listDir(self, path):
  90. for root,dirs,files in os.walk(path):
  91. for file in files:
  92. if file in FirstRoundImages.keys():
  93. print("firstRound: " + file)
  94. if file == 'secos.toc':
  95. self.firstRoundImageDict[file] = FirstRoundImages[file]
  96. self.firstRoundImageDict['secosbak.toc'] = FirstRoundImages['secosbak.toc']
  97. continue
  98. if file == 'u-boot.toc':
  99. self.firstRoundImageDict[file] = FirstRoundImages[file]
  100. self.firstRoundImageDict['u-bootbak.toc'] = FirstRoundImages['u-bootbak.toc']
  101. continue
  102. self.firstRoundImageDict[file] = FirstRoundImages[file]
  103. if file in SecondRoundImages.keys():
  104. print("secondRound: " + file)
  105. self.secondRoundImageDict[file] = SecondRoundImages[file]
  106. def indent(self, elem, level=0):
  107. i = "\n" + level*" "
  108. if len(elem):
  109. if not elem.text or not elem.text.strip():
  110. elem.text = i + " "
  111. for e in elem:
  112. self.indent(e, level+1)
  113. if not e.tail or not e.tail.strip():
  114. e.tail = i
  115. if level and (not elem.tail or not elem.tail.strip()):
  116. elem.tail = i
  117. return elem
  118. if __name__ == '__main__':
  119. if len(sys.argv) < 2:
  120. print("Usage: python3 generateConfigXml.py dirOfTheImages")
  121. sys.exit(1)
  122. obj = GenerateConfigXML(sys.argv[1])
  123. obj.buildConfigXML()

最后生成的config.xml内容如下:

  1. <root>
  2. <FirstRound />
  3. <SecondRound>
  4. <factorytest.img address="otaloaderbak" md5="2bca7c24acf471ad4126e63224b117c3" name="factorytest.img" path="factory20160411/factorytest.img" />
  5. <iploader.img address="iploader" md5="40d6bf4fe05bb4ce2d500464d48da5a4" name="iploader.img" path="factory20160411/iploader.img" />
  6. <boot.img address="boot" md5="b1937b921ee1122f1946dcb96811e69e" name="boot.img" path="factory20160411/boot.img" />
  7. <system.img address="system" md5="12fe7f8c8920c18a3cc9a815f201cca7" name="system.img" path="factory20160411/system.img" />
  8. <otaloader.img address="otaloader" md5="0831e96caf91482dbb9efde1ca29d3bd" name="otaloader.img" path="factory20160411/otaloader.img" />
  9. <userdata.img address="userdata" md5="536d084f75a46470f2373e3052d288dc" name="userdata.img" path="factory20160411/userdata.img" />
  10. </SecondRound>
  11. </root>

最后顺便提供下python3下的MD5计算方法,见下面这个类

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'djstava@gmail.com'
  3. import hashlib
  4. class CalcMD5(object):
  5. def __init__(self):
  6. pass
  7. @classmethod
  8. def calcFileMd5(self,filePath):
  9. '''
  10. :param filePath:
  11. :return: file checksum value
  12. '''
  13. md5 = hashlib.md5()
  14. fp = open(filePath,'rb')
  15. md5.update(fp.read())
  16. while True:
  17. block = fp.read(1048576)
  18. if not block:
  19. break
  20. md5.update(block)
  21. fp.close()
  22. return md5.hexdigest()
  23. @classmethod
  24. def calcStringMd5(self,str):
  25. '''
  26. :param str:
  27. :return: string checksum value
  28. '''
  29. return hashlib.md5(str.encode("utf-8")).hexdigest()

python3解析XML文件的更多相关文章

  1. Python3 解析XML 层序遍历二叉树

    Python3 解析XML 层序遍历二叉树 keyword : python3, xml, xml.dom.minidom, 层序遍历, 层次遍历, 二叉树 part1 问题描述 面对如下 XML 文 ...

  2. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  3. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  4. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  5. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  6. XML:使用DOM技术解析xML文件中的城市,实现select级联选择

    中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...

  7. dom4j如何解析XML文件

    最近在 一些对xml文件的操作,下面简单写一个dom4j解析xml文件并将其封装到一个javabean中的例子,只是具有针对性的,不是通用的,仅供参考哦~~ 首先说:dom4j是一个java的XML ...

  8. java解析XML文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...

  9. Android开发学习---使用XmlPullParser解析xml文件

    Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将 ...

随机推荐

  1. Vue拖拽组件

    vue开发公众号项目,***产品需要添加一个新的功能.拖拽功能.一听简单.百度上轮子挺多,直接拉一个过来用着就行.然鹅...兴奋之余,却失望至极.东西很多,没有一个能使得.你让我失望,那我就让你绝望. ...

  2. Linux博客系统服务器搭建

    linux(CentOS)服务器搭建 前言 拿到购买的服务器信息后,会给出一个服务器的账号的密码,看你自己设置,账号一般为root. 拿到后,可在阿里云官网登录进入服务器.然后就可以进行一下的流程从而 ...

  3. HihoCoder - 1794:拼三角形 (状压DP)

    描述 给定 n 根木棍,第 i 根长度为 ai 现在你想用他们拼成尽量多的面积大于 0 的三角形,要求每根木棍只能被用一次,且不能折断 请你求出最多能拼出几个 输入 第一行一个正整数 n 第二行 n ...

  4. HDU 2111:Saving HDU(贪心)

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. HDU 4669 Mutiples on a circle 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4669 考察对取模的的理解深不深刻啊,当然还有状态的设计····设d[i][j]表示以第i个数结尾,余 ...

  6. hdu1069 dp

    题意:有若干种不同规格(长.宽.高)的砖块,每种砖块有无数个,可以自由选择以砖块的哪条边做长.宽或高,用这些砖块搭高塔,要求上面砖块的长宽必须严格小于下面砖块的长宽,问塔最高能有多高 我的做法是每读入 ...

  7. hdu1243 dp (类最长公共子序列)

    题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分. 这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问 ...

  8. android BSP移植综述

    将android移植到特定硬件平台上,其核心是bsp的搭建工作,bsp是板级支持包,并不是特定某个文件,而是从功能上理解的一种硬件适配软件包,它的核心就是: 1. linux内核硬件相关部分(主要是l ...

  9. 【MVC】Controller的使用

    1,控制器中所有的动作方法必须声明为public,如声明为private或protected,将不被视为动作方法. 如果将Action声明为private,或者是添加[NonAction]属性,则不对 ...

  10. 7 无线wifi传输视频开发

    转载,侵删 7 无线wifi传输视频开发 MT7601的驱动源码提供了两种:AP模式和STA模式源码.此时我使用USB作为AP热点,电脑作为STA模式,并使用ORTP实现无线传输视频 7.1.AP模式 ...