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的更多相关文章

  1. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

  2. 使用Pull解析器生成XML文件和读取xml文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  3. SAX解析和生成XML文档

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

  4. xml解析与生成的学习资料

    xml解析与生成的学习资料:http://blog.csdn.net/u012325167/article/category/6129813 ----------------------------- ...

  5. maven中使用dom4j解析、生成XML的简易方法

    此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...

  6. 使用Pull解析器生成XML文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  7. 面试官问我:如何在 Python 中解析和修改 XML

    摘要:我们经常需要解析用不同语言编写的数据.Python提供了许多库来解析或拆分用其他语言编写的数据.在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML. 本文分享 ...

  8. 使用XMl序列化器生成xml文件

    生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...

  9. python 解析与生成xml

    xml.etree.ElementTree模块为xml文件的提取和建立提供了简单有效的API.下文中使用ET来代表xml.etree.ElementTree模块. XML是一种内在的分层的数据形式,展 ...

随机推荐

  1. 打开CSDN论坛出现403

    打开CSDN论坛出现403 在查找资料的过程中,出现"403-禁止访问"

  2. windows驱动程序wdf--KMDF大致框架

    继WDM后微软出了WDF,封装了WDM中的一些基本代码逻辑.本人菜鸟,也不知道本质上有何区别,只觉得是多了Wdf开头的函数,基本的编程框架上有点出入. KMDF是WDF的内核级部分,为了理清KMDF的 ...

  3. FtpHelper ftp操作类库

    FtpHelper ftp操作类库 using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  4. android界面设计之布局管理

    谈到android界面设计,各种布局样式不得不提!传统的布局方式有6种,我们会一一介绍. 在android studio2.2版本之后出现了一款超棒的布局方式,真正意义上的所见即所得,后面我们也会讲到 ...

  5. iOS - MFi 认证

    1.MFi 认证 1.1 什么是 MFi 认证 苹果 MFi 认证,是苹果公司(Apple Inc.)对其授权配件厂商生产的外置配件的一种标识使用许可,是 Apple 公司 "Made fo ...

  6. javascript右键菜单分析

    右键菜单 思路 1.遮蔽原来的默认右键菜单 2.新建右键菜单跟随鼠标移动 3.注意边界处的位置变化 4.自定义右键内容的具体效果 具体 这样的事件涉及到有关contextmenu事件,阻止默认事件,获 ...

  7. RobotFramework下的http接口自动化Get Response Body关键字的使用

    Get Response Body 关键字在上面已经有用到了,服务器端在处理完成了发出的http请求后,会给出对应的响应结果,那么Get Response Body这个关键字就是来获取响应结果中的主体 ...

  8. 【JDK1.8】JUC.Lock综述

    一.前言 前段时间结束了jdk1.8集合框架的源码阅读,在过年的这段时间里,一直在准备JUC(java.util.concurrent)的源码阅读.平时接触的并发场景开发并不很多,但是有网络的地方,就 ...

  9. [Luogu3345][ZJOI2015]幻想乡战略游戏

    Luogu 题意: 动态维护带权重心. sol 这是一道写起来很舒服的动态点分治.(不像某些毒瘤题) 我们考虑,如果你选择的补给点不是当前的带权重心,那么带权重心就在补给点的一个子树中(你把补给点当做 ...

  10. [CodeVS2370] 小机房的树 (LCA, 树链剖分, LCT)

    Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花 ...