【Python】 xml解析与生成 xml
xml
*之前用的时候也没想到。。其实用BeautifulSoup就可以解析xml啊。。因为html只是xml的一种实现方式吧。但是很蛋疼的一点就是,bs不提供获取对象的方法,其find大多获取的都是字符串,这就导致不得不一遍遍地连续通过bs总对象来定位元素再输出这样子。挺麻烦的。
xml是一种常用的网络通讯格式,也是一种文件的格式。xml包里有多种不同的可用于解析&生成文件的模块,比如:
xml.dom.minidom
xml.etree.ElementTree
xml.aix等等。这三者比较起来,minidom最贴近底层代码,但是写起来也最烦。本文主要通过ElementTree来解析&生成。尽管ElementTree也有很多不合理的地方,但是可以通过修改源码,重载源码的部分方法来解决。
■ ElementTree基本用法
from xml.etree import ElementTree
doc = ElementTree.parse("文件路径"or"文件对象"[,parser=...])
'''
虽然也可用ElementTree直接来生成文件对象,但是用parse来生成的话可以指定parser。这个parser后面会讲到有什么作用
'''
所得到的doc对象就是文件的根节点对象。所谓根节点,就是整个文件第一对有效的标签所指代的节点。
● 对于每个节点,都有:
.text 代表该节点的文本内容(和bs一样,那些有子孙元素但是本身没有内容的节点的这个属性是空串,需要注意)
.attrib 代表该节点的属性(字典形式)
.tag 代表该节点的tag名
● 而对于包括根节点在内的所有节点都有以下节点可调用的方法:
.find("tag名") 找出其子节点中第一个指定tag名的节点
.findall("tag名") 找出所有子节点which是指定的tag名,返回一个列表
.findtext("tag名") 找出相应子节点的文本内容,相当于上面的find找到对象之后再访问其.text属性
//以上三个方法都是只检索子节点,不检索孙节点以及更加后辈的节点
.getiterator([tag]) 从当前节点开始,生成一个迭代器,里面是遍历了包括当前节点在内的所有后辈节点。tag参数相当于一个filter,指定tag的话迭代器只返回tag名和给出值一致的节点。
*以上的那些find啥啥的方法,里面的tag名其实是有语法的。单纯的"tag"就只检索当前节点的子节点中名为tag的节点。如果是'.//tag'的话就是搜索所有后辈节点中的tag节点了。更多具体的语法可以参见python参考手册,就不多说了
● 另外,ElementTree也在节点对象中实现了几个magic method,所以节点(这次不包括根节点了)也有了如下借口:
elem[n] 节点elem的第n个子节点(不是n+1个!)
del elem[n] 删除elem的第n个子节点
len(elem) 子节点的个数
elem[n] = newElement 将某个子节点替换成另外一个element
● 对于非根节点,还有以下的一些方法:
clear() 清空所有后辈节点
append(Element) 加入一个新子节点
get(key) 获取某个属性的值
insert(index,Element) 将子节点插入某个特定的位置
remove(Element) 从该节点中移除一个子节点
set(key,value) 设置某个节点的属性值
● 关于Element的构造方法
上面很多方法都用element作为参数,那么element是怎么来的,就要用到Element构造方法了。
ElementTree.Element(tag[,attrib]) 构造一个Element,但是没有文本内容
ElementTree.XML("xmlcode") 将一段xml代码转化为一个Element对象,比较实用
ElementTree.Comment("text") 生成一段注释的Element对象
● 最后,ElementTree还提供了几个类方法
ElementTree.dump(Element) 把相关element的内容打印出来,主要用于调试。因为element对象普遍没有实现__repr__方法
ElementTree.iselement(element) 判断某个对象是不是有效的element对象
以上的所有操作都是对存储在内存中的一个XMLTree对象的改动,要想保存成文件,只要根节点调用方法write即可
doc.write("文件路径"or"w模式文件对象"[,encoding=xxx])
这里面的encoding参数也有点意思。encoding的默认值是utf-8,当encoding被指定且不是utf-8或者ascii的时候,在新生成的文件头上自动会加一条<?xml version="1.0" encoding="xxx">
*ElementTree有一个很大的问题,就是在默认情况下,会吃掉所有注释内容。
这种现象的原因是因为,源码中默认的TreeBuilder(这个类的作用是构建一个对象,这个对象用来存储抽象化后的文件内容。)在建立Tree对象的时候没有写处理注释的方法。
解决方法是自己写个CommentedTreeBuilder类来重载处理注释:
class CommentedTreeBuilder(XMLTreeBuilder):
def __init__(self, html=0, target=None):
XMLTreeBuilder.__init__(self, html, target)
self._parser.CommentHandler = self.handle_comment #指定处理comment的方法。
def handle_comment(self, data):
'''
默认的处理comment的方法是什么都不做直接pass,而在这个方法里,通过start,data和end三个方法,相当于把注释的内容原封不动地复制到创建的Tree对象里去,使得注释得以保存
'''
self._target.start(Comment, {})
self._target.data(data)
self._target.end(Comment)
handle_comment方法接受的参数data是一个ascii字符串或者unicode字符串。当有中文字符时无疑data是unicode。如果在write的时候不指明encoding类型的话可能会出现写入中文字符出错,变成其编码的格式了。解决办法就是在write的时候指出encoding参数如encoding='UTF-8'
【Python】 xml解析与生成 xml的更多相关文章
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- 使用Pull解析器生成XML文件和读取xml文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
- xml解析与生成的学习资料
xml解析与生成的学习资料:http://blog.csdn.net/u012325167/article/category/6129813 ----------------------------- ...
- maven中使用dom4j解析、生成XML的简易方法
此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...
- 使用Pull解析器生成XML文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- 面试官问我:如何在 Python 中解析和修改 XML
摘要:我们经常需要解析用不同语言编写的数据.Python提供了许多库来解析或拆分用其他语言编写的数据.在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML. 本文分享 ...
- 使用XMl序列化器生成xml文件
生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...
- python 解析与生成xml
xml.etree.ElementTree模块为xml文件的提取和建立提供了简单有效的API.下文中使用ET来代表xml.etree.ElementTree模块. XML是一种内在的分层的数据形式,展 ...
随机推荐
- R︱Linux+Rstudio Server尝鲜笔记(打造最佳Rstudio体验+报错的解决方案)
Rstudio Server 是Rstudio开发的基于R语言的网页版(只能在Linux),你在手机上都可以运行R,还是挺方便的.就是配置起来有点麻烦. 官方下载链接:https://www ...
- RS232 3线制与7线制的区别
当通信距离较近时,可不需要Modem,通信双方可以直接连接,这种情况下,只需使用少数几根信号线.最简单的情况,在通信中根本不需要RS-232C的控制联络信号,只需三根线(发送线.接收线.信号地线)便可 ...
- 用SDL库播放yuy2 Packed mode
#define SDL_YUY2_OVERLAY 0x32595559 /* Packed mode: Y0+U0+Y1+V0 */ if (SDL_Init(SDL_INIT_VIDEO) < ...
- MyEclipse提示出错
1.错误描述 The 'org.eclipse.jdt.ui.JavaAllCompletionProposalComputer' proposal computer from 'org.eclips ...
- Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- 如何登录mysql? cmd怎么连接mysql数据库||从MYSQL客户端登录MYSQL
1 2 3 4 5 6 7 分步阅读 Mysql开源数据库,任何人都可以下载安装使用.那么安装好的mysql如何登陆连接mysql数据库呢?本经验咗嚛介绍几种常见的方法 工具/原料 mysql 连 ...
- 解决无法同步 OneNote 的问题
在本地创建的笔记本,无法共享到云端,显示无法连接onedrive. 关闭改笔记本,重新连接共享. 参考: https://support.office.com/zh-cn/article/%E8%A7 ...
- I2C总线通讯协议
I2C总线通讯协议 1. I2C总线简介 I2C是Inter-Integrated Circuit的简称,读作:I-squared-C.由飞利浦公司于1980年代提出,为了让主板.嵌入式系统或手机用以 ...
- JVM 调优系列之图解垃圾回收
摘要: jvm必知系列,总结一些常见jvm回收机制,方便查阅 对于调优之前,我们必须要了解其运行原理,java 的垃圾收集Garbage Collection 通常被称为"GC", ...
- RobotFramework自动化测试框架-移动手机自动化测试Get Network Connection Status和Set Network Connection Status关键字的使用
Get Network Connection Status关键字用来获取手机的网络连接状态.在获取到连接状态后,会返回不同的数字. Set Network Connection Status关键字用来 ...