python解析xml模块封装代码
在python中解析xml文件的模块用法,以及对模块封装的方法。
原文转自:http://www.jbxue.com/article/16586.html
有如下的xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<childs>
<child name='first' >1</child>
<child value="2">2</child>
</childs>
</root>
下面介绍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 = '''''<?xml version="1.0" encoding="UTF-8"?>
<hash>
<request name='first'>/2/photos/square/type.xml</request>
<error_code>21301</error_code>
<error>auth faild!</error>
</hash>
'''
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:
<?xml version="1.0" ?><hash>
<request name="first">/2/photos/square/type.xml</request>
<error_code>21301</error_code>
<error>auth faild!</error>
</hash>
root: www.jbxue.com
<hash>
<request name="first">/2/photos/square/type.xml</request>
<error_code>21301</error_code>
<error>auth faild!</error>
</hash>
<request name="first">/2/photos/square/type.xml</request>
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节点。
python解析xml模块封装代码的更多相关文章
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- python解析xml之lxml
虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...
- python 解析xml
在工作中很多时候都要用到xml,使用这个时候难免会设计到解析他,然后就研究了一下python解析xml问题,看了很多东西,python有很多解析xml的包,但是也折腾我好一段时间,最后选择了这个方法. ...
- 横向对比分析Python解析XML的四种方式
横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...
- python解析xml
python解析xml import xml.dom.minidom as minidom dom = minidom.parse("aa.xml") root = dom.get ...
- Python 解析 XML 文件生成 HTML
XML文件result.xml,内容如下: <ccm> <metric> <complexity>1</complexity> <unit> ...
- Python 解析XML实例(xml.sax)
已知movies.xml <collection shelf="New Arrivals"> <movie title="Enemy Behind&qu ...
- 【TensorFlow】Python解析xml文件
最近在项目中使用TensorFlow训练目标检测模型,在制作自己的数据集时使用了labelimg软件对图片进行标注,产生了VOC格式的数据,但标注生成的xml文件标签值难免会产生个别错误造成程序无法跑 ...
- PYTHON解析XML的多种方式效率对比实测
在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜索后发现,目前应用比较广泛,且效率相对较高的E ...
随机推荐
- CodeForces 602D 【单调队列】【简单数学】
题意: 给你n个数,m次询问,每次询问给l和r代表l和r中间所有子区间中特征值的和. 特征值的定义是在这个区间中找i和j使得|tmp[i]-tmp[j]|/|j-i|最大. 思路: 首先是特征值的定义 ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(6)
在企业应用中,用户的用户名.密码和角色等信息一般存放在RDBMS(关系数据库)中.前面几节我们采用的是InMemoryDaoImpl,即基于内存的存放方式.这节我们将采用RDBMS存储用户信息. Us ...
- YUV主要采样格式理解
主要的采样格式有YCbCr 4:2:0.YCbCr 4:2:2.YCbCr 4:1:1和 YCbCr 4:4:4.其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也 ...
- MFC学习 画图设置字体按钮风格
修改按钮样式时, 设置按钮关联哪个按钮类, 按钮类是自己写的, 从CButton继承, 重写DrawItem可修改按钮样式. 代码中包括画线, 点, 圆, 设置这些的样式, 如线粗, 颜色, 字体. ...
- VC 类泡泡龙游戏算法
#include <stdio.h> #include <malloc.h> #include <string.h> /* 1 2 1 2 2 1 2 1 2 1 ...
- Linux学习小结(转)
linux目录架构 / 根目录/bin 常用的命令 binary file 的目錄/boot 存放系统启动时必须读取的档案,包括核心 (kernel) 在内/boot/grub/menu.l ...
- 【翻译】使用CSS3和jQuery制作跟随鼠标方位的Hover特效
今天我们来学习如何通过CSS3的特性和jQuery来创建一个感知鼠标滑动方向的hover效果.当鼠标滑进的时候,遮罩层会从上次鼠标滑出的方向滑入,当鼠标滑出的时候,遮罩层会跟随鼠标,从鼠标滑出的方向滑 ...
- Oracle 时间相减得出毫秒、秒、分、时、天,,【转】
http://blog.csdn.net/redarmy_chen/article/details/7351410 oracle 两个时间相减默认的是天数 oracle 两个时间相减默认的是天数*24 ...
- CENTOS7设置显示中文
vi /etc/locale.conf LANG="zh_CN.UTF-8" LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN&quo ...
- org.springframework.jdbc.BadSqlGrammarException
org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLExc ...