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

python解析xml模块封装代码

这篇文章主要分享下在python中解析xml文件的模块用法,以及对模块封装的方法,有需要的朋友参考下
有如下的xml文件:

代码如下:





1
2


下面介绍python解析xml文件的几种方法,使用python模块实现。

方式1,python模块实现自动遍历所有节点:

代码如下:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from xml.sax.handler import ContentHandler
from xml.sax import parse
class TestHandle(ContentHandler):
def __init__(self, inlist):
self.inlist = inlist

def startElement(self,name,attrs):
print 'name:',name, 'attrs:',attrs.keys()

def endElement(self,name):
print 'endname',name

def characters(self,chars):
print 'chars',chars
self.inlist.append(chars)


if __name__ == '__main__':
lt = []
parse('test.xml', TestHandle(lt))
print lt

结果:
[html] view plaincopy
name: root attrs: []
chars

name: childs attrs: []
chars

name: child attrs: [u'name']
chars 1
endname child
chars

name: child attrs: [u'value']
chars 2
endname child
chars

endname childs
chars

endname root
[u'\n', u'\n', u'1', u'\n', u'2', u'\n', u'\n']

方式2,python模块实现获取根节点,按需查找指定节点:

代码如下:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from xml.dom import minidom
xmlstr = '''''

/2/photos/square/type.xml
21301
auth faild!

'''
def doxml(xmlstr):
dom = minidom.parseString(xmlstr)
print 'Dom:'
print dom.toxml()

root = dom.firstChild
print 'root:'
print root.toxml()

childs = root.childNodes
for child in childs:
print child.toxml()
if child.nodeType == child.TEXT_NODE:
pass
else:
print 'child node attribute name:', child.getAttribute('name')
print 'child node name:', child.nodeName
print 'child node len:',len(child.childNodes)
print 'child data:',child.childNodes[0].data
print '======================================='
print 'more help info to see:'
for med in dir(child):
print help(med)


if __name__ == '__main__':
doxml(xmlstr)

结果:
[html] view plaincopy
Dom:

/2/photos/square/type.xml
21301
auth faild!

root:

/2/photos/square/type.xml
21301
auth faild!


/2/photos/square/type.xml
child node attribute name: first
child node name: request
child node len: 1
child data: /2/photos/square/type.xml
=======================================
more help info to see:
两种方法各有其优点,python的xml处理模块太多,目前只用到这2个。

=====补充分割线================
实际工作中发现python的mimidom无法解析其它编码的xml,只能解析utf-8的编码,而其xml文件的头部申明也必须是utf-8,为其它编码会报错误。
网上的解决办法都是替换xml文件头部的编码申明,然后转换编码为utf-8再用minidom解码,实际测试为可行,不过有点累赘的感觉。

本节是 python解析xml模块封装代码 的第二部分。
====写xml内容的分割线=========

代码如下:


#!\urs\bin\env python
#encoding: utf-8
from xml.dom import minidom

class xmlwrite:
def __init__(self, resultfile):
self.resultfile = resultfile
self.rootname = 'api'
self.__create_xml_dom()

def __create_xml_dom(self):
xmlimpl = minidom.getDOMImplementation()
self.dom = xmlimpl.createDocument(None, self.rootname, None)
self.root = self.dom.documentElement

def __get_spec_node(self, xpath):
patharr = xpath.split(r'/')
parentnode = self.root
exist = 1
for nodename in patharr:
if nodename.strip() == '':
continue
if not exist:
return None
spcindex = nodename.find('[')
if spcindex > -1:
index = int(nodename[spcindex+1:-1])
else:
index = 0
count = 0
childs = parentnode.childNodes
for child in childs:
if child.nodeName == nodename[:spcindex]:
if count == index:
parentnode = child
exist = 1
break
count += 1
continue
else:
exist = 0
return parentnode


def write_node(self, parent, nodename, value, attribute=None, CDATA=False):
node = self.dom.createElement(nodename)
if value:
if CDATA:
nodedata = self.dom.createCDATASection(value)
else:
nodedata = self.dom.createTextNode(value)
node.appendChild(nodedata)
if attribute and isinstance(attribute, dict):
for key, value in attribute.items():
node.setAttribute(key, value)
try:
parentnode = self.__get_spec_node(parent)
except:
print 'Get parent Node Fail, Use the Root as parent Node'
parentnode = self.root
parentnode.appendChild(node)


def write_start_time(self, time):
self.write_node('/','StartTime', time)

def write_end_time(self, time):
self.write_node('/','EndTime', time)

def write_pass_count(self, count):
self.write_node('/','PassCount', count)

def write_fail_count(self, count):
self.write_node('/','FailCount', count)

def write_case(self):
self.write_node('/','Case', None)

def write_case_no(self, index, value):
self.write_node('/Case[%s]/' % index,'No', value)

def write_case_url(self, index, value):
self.write_node('/Case[%s]/' % index,'URL', value)

def write_case_dbdata(self, index, value):
self.write_node('/Case[%s]/' % index,'DBData', value)

def write_case_apidata(self, index, value):
self.write_node('/Case[%s]/' % index,'APIData', value)

def write_case_dbsql(self, index, value):
self.write_node('/Case[%s]/' % index,'DBSQL', value, CDATA=True)

def write_case_apixpath(self, index, value):
self.write_node('/Case[%s]/' % index,'APIXPath', value)

def save_xml(self):
myfile = file(self.resultfile, 'w')
self.dom.writexml(myfile, encoding='utf-8')
myfile.close()

if __name__ == '__main__':
xr = xmlwrite(r'D:\test.xml')
xr.write_start_time('2223')
xr.write_end_time('444')
xr.write_pass_count('22')
xr.write_fail_count('33')
xr.write_case()
xr.write_case()
xr.write_case_no(0, '0')
xr.write_case_url(0, 'http://www.google.com')
xr.write_case_url(0, 'http://www.google.com')
xr.write_case_dbsql(0, 'select * from ')
xr.write_case_dbdata(0, 'dbtata')
xr.write_case_apixpath(0, '/xpath')
xr.write_case_apidata(0, 'apidata')
xr.write_case_no(1, '1')
xr.write_case_url(1, 'http://www.baidu.com')
xr.write_case_url(1, 'http://www.baidu.com')
xr.write_case_dbsql(1, 'select 1 from ')
xr.write_case_dbdata(1, 'dbtata1')
xr.write_case_apixpath(1, '/xpath1')
xr.write_case_apidata(1, 'apidata1')
xr.save_xml()

以上封装了minidom,支持通过xpath来写节点,不支持xpath带属性的匹配,但支持带索引的匹配。
比如:/root/child[1], 表示root的第2个child节点。

推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
author-avatar
Elaine_Fox
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有