xml解析

一、xml简介

XML 被设计用来传输和存储数据。

HTML 被设计用来显示数据。

1).什么是xml

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。

2).xml和html的区别

XML 不是 HTML 的替代。

XML 和 HTML 为不同的目的而设计:

  • XML 被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。

***

XML 被设计用来结构化、存储以及传输信息。所以XML 不会做任何事情。

XML 语言没有预定义的标签。所以我们可以自定义标签,注意,尽量不定义关键字标签。

XML是对HTML的补充,但不是HTML的替代,在大多数 Web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。

XML 是独立于软件和硬件的信息传输工具。

python对XML的解析

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

python有三种方法解析XML,SAX,DOM,以及ElementTree:

方法 特点
SAX SAX解析通过流模式在解析XML的过程中触发对应的事件(start_element、char_data、end_element)并调用用户定义的回调函数来处理XML文件。
DOM 将XML数据在内存中解析成一个树,通过对树的操作来操作XML,占用内存大,解析速度较慢,优点是可以任意遍历树的节点。
ElementTree 类似一个轻量级的DOM

我们先使用ElementTree解析一个XML文件,文件如下:

<?xml version="1.0" encoding='utf-8'?>   #申明为XML<data>           #父节点<country name="Liechtenstein">      #子节点<rank>1</rank>      #子节点的子节点<year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country><country name="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighbor name="Malaysia" direction="N"/></country><country name="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighbor name="Costa Rica" direction="W"/><neighbor name="Colombia" direction="E"/></country>
</data>

解析代码如下:

#usr/bin/python
#-*-coding:utf-8-*-
import xml.etree.ElementTree as ET
'''
tag ,即标签,用于标识该元素表示哪种数据,即APP_KEY
attrib,即属性,用Dictionary形式保存,即{'channel'='CSDN'}
text ,文本字符串,可以用来存储一些数据,即hello123456789
'''
#先加载文档到内存里,形成一个倒桩的树结构
tree = ET.parse('huihui.xml')
#获取根节点
root = tree.getroot()
huihui={}
for ele in root:value=[]for e in ele:if e.text is None:value.append(e.attrib)else:value.append({e.tag:e.text})huihui[ele.attrib['name']]=value
print(huihui)

上述代码我们先引用了一个xml.etree.ElementTree库,并另取名ET,然后加载文档到tree内存中,形成一个倒桩的树结构,然后我们获取了文本的根节点root。建立一个for循环,让ele遍历root,得到根节点(即country),然后再使e遍历ele,获取到子节点,再进行判断,子节点中是否存在文本,如果不存在,在value列表中追加子节点的属性,如果存在,则以tag为key,以text为value的字典模式追加到value的列表中,最后我们以ele的属性名为key,对应的value列表value放在字典huihui中,输出huihui。

我们还可以查找需要的根/子节点,并修改,如下:

#仍以上述为模板
nodes=root.findall('country')
for node in nodes:if node.attrib['name']=='Liechtenstein':root.remove(node)tree.write('huihuihui.xml')
print('删除成功')

首先获取root中名为'country'的根节点,然后循环遍历,寻找属性名为'liechtenstein'的子节点,找到之后将其删除。

下面我们使用SAX解析XML

SAX是事件驱动的XML解析的标准接口。 使用SAX解析XML通常需要通过子类化xml.sax.ContentHandler来创建自己的ContentHandler
ContentHandler处理XML样式/风格的特定标签和属性。 ContentHandler对象提供了处理各种解析事件的方法。它拥有的解析器在解析XML文件时调用ContentHandler方法。
在XML文件的开头和结尾分别调用:startDocument和endDocument方法。 characters(text)方法通过参数text传递XML文件的字符数据。

ContentHandler在每个元素的开头和结尾被调用。如果解析器不在命名空间模式下,则调用startElement(tag,attributes)和endElement(tag)方法; 否则,调用相应的方法startElementNS和endElementNS方法。 这里,tag是元素标签,属性是Attributes对象。

我们使用如下一个XML实践:

<?xml version="1.0" encoding="utf-8" ?>
<collection shelf = "New Arrivals"><movie title = "Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2013</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description></movie><movie title = "Transformers"><type>Anime, Science Fiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>A schientific fiction</description></movie><movie title = "Trigun"><type>Anime, Action</type><format>DVD</format><episodes>4</episodes><rating>PG</rating><stars>10</stars><description>Vash the Stampede!</description></movie><movie title = "Ishtar"><type>Comedy</type><format>VHS</format><rating>PG</rating><stars>2</stars><description>Viewable boredom</description></movie>
</collection>

代码如下:

#usr/bin/python
#-*-coding:utf-8-*-
import xml.sax
#首先引用xml.sax库
class MovieHandler(xml.sax.ContentHandler):      #创建一个类def __init__(self):self.CurrentData = ""self.type = ""self.format = ""self.year = ""self.rating = ""self.stars = ""self.description = ""def startElement(self, tag, attributes):self.CurrentData = tagif tag == "movie":print("*****Movie*****")title = attributes["title"]print("Title:", title)def characters(self, content):if self.CurrentData == "type":self.type = contentelif self.CurrentData == "format":self.format = contentelif self.CurrentData == "year":self.year = contentelif self.CurrentData == "rating":self.rating = contentelif self.CurrentData == "stars":self.stars = contentelif self.CurrentData == "description":self.description = contentdef endElement(self, tag):if self.CurrentData == "type":print("Type:", self.type)elif self.CurrentData == "format":print("Format:", self.format)elif self.CurrentData == "year":print("Year:", self.year)elif self.CurrentData == "rating":print("Rating:", self.rating)elif self.CurrentData == "stars":print("Stars:", self.stars)elif self.CurrentData == "description":print("Description:", self.description)#清空缓冲区!!!self.CurrentData = ""if (__name__ == "__main__"):# 1 创建一个XMLReaderparser = xml.sax.make_parser()# 2关闭命名空间 namepsaces工作目录 工作空间 命名空间parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 3 覆盖默认的 ContextHandlerHandler = MovieHandler()parser.setContentHandler(Handler)  #  设置当前的ContentHandler为我们自己写的handler实例。#parse() 加载parser.parse("movie.xml")    #上述的xml存储在movie.xml中

我们先创建一个类,然后初始化参数(根据要解析的xml中的参数),使用startElement,将获取到的值赋值给CurrentDate,然后判断CurrentDate的值是否为movie,如果是,打印一个*****movie*****,并给title赋值获取节点的属性名,在打印出来。如果值不为movie,则依次判断CurrentDate的值为哪个参数,判断到了,则赋值给那个参数,然后在endElement中将对应的值打印,最后再清除CurrentDate的值,然后继续循环下一个节点,所以整个类是将XML中每一个节点都查找一遍,根据对应的值将其打印的模式进行。最终输出一下结果:

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2013
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

python学习18相关推荐

  1. 小猪的Python学习之旅 —— 18.Python微信转发小宇宙早报

    小猪的Python学习之旅 -- 18.Python微信转发小宇宙早报 标签:Python 一句话概括本文: 利用itchat,监控特定信息,转发到特定微信群- 引言: 上一篇 小猪的Python学习 ...

  2. Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复)

    Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复) 网课传送门:https://www.bilibili.com/video/BV1Sw411Z779?p=168& ...

  3. python列表和字典_2020/11/18 python学习第5课 列表和字典

    python学习第5课 列表和字典 课程目标 熟练掌握列表.字典中元素的增删改查 理解列表和字典的区别 课程难点 列表与字典增删改查的异同 正确使用切片,深刻理解切片时冒号左右数字的意义 课程知识点总 ...

  4. python学习------tab补全

    python学习------tab补全   python也可以进行tab键补全 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/usr/bin/env  ...

  5. Python学习系列(六)(模块)

    Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...

  6. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

  7. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  8. Python学习教程(Python学习路线):Python面试100题(二)

    Python学习教程(Python学习路线):面试题接着给大家整理! 16.<div class="nam">中国</div>,用正则匹配出标签里面的内容( ...

  9. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

最新文章

  1. 【linux】Valgrind工具集详解(六):使用Valgrind gdbserver和GDB调试程序
  2. 计算机专业中专排名,成都计算机中专学校排名
  3. 2021春季每日一题 【week2 未完结】
  4. 关于Dockerfile那些事: 基础镜像的坑
  5. %matplotlib inline 是什么意思
  6. c语言判断闰年_C语言1博客作业06 - D丶千思
  7. “机密蔓延”成软件供应链安全的梦魇
  8. 关于 Safari 浏览器不支持 location [ window.location.href window.open()] 跳转问题的解决方案
  9. 自定义View合辑(2)-饼状图
  10. 【原】对txt文本进行数据读取
  11. r语言 与python r中python环境的创建
  12. 360网站域名拦截检测 非法网址检测系统原理
  13. 计算机房电磁辐射防护,机房防辐射处理解决方案
  14. win10计算机出现乱码,win10系统出现汉字乱码如何解决
  15. MTK6577+Android环境变量
  16. 解决使用百度地图API时偏移问题并自适应中心点和比例
  17. XDOS DAS Call WIS NET F6 (HELP)- WIS Is Not Available Solution
  18. 初步使用openEuler华为欧拉Linux系统
  19. 几种概率分布(伯努利分布、二项分布、泊松分布、均匀分布、正态分布、指数分布、伽马分布)
  20. 联想笔记本那些有手写功能_联想笔记本电脑手写

热门文章

  1. 计算机提示找不到系统文件,为何我的电脑一开机就显示Windows找不到文件
  2. 程序猿必备技能之MySQL高级篇
  3. idea设置全局ignore
  4. Functional Programming in C++
  5. 在二叉树中找到两个节点的最近公共祖先(C++)
  6. _stdcall和_cdec区别
  7. Golang蓝湖一面
  8. 编译静态文件系统测试工具【FIO】并在QEMU中运行
  9. 正则表达式元字符大整理
  10. vue项目该不该使用eslint验证?