活动地址:CSDN21天学习挑战赛
作者简介:大家好我是Apathfinder,目前是一名在校大学生,软件工程专业,记录学习路上的点点滴滴。
个人主页:Apathfinder本文专栏:Python学习
前言:本文是对XML语言的基本介绍以及基础使用。
目录
正文
一.XML简介
1.什么是XML
- XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
- XML 被设计用来传输和存储数据。
- XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。
- XML 是一种类似HTML的标记语言。
- XML 的设计宗旨是传输数据,而不是显示数据。
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准。
- XML也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。
2.XML的用途
XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。
- 把数据从 HTML 分离
- 简化数据共享
- 简化数据传输
- 简化平台的变更
- 用于创建新的 Internet 语言
3.XML 和 HTML 之间的差异
XML 不是 HTML 的替代,XML 是对 HTML 的补充。
XML 和 HTML 为不同的目的而设计:
- XML 被设计用来传输和存储数据,其焦点是数据的内容,旨在传输信息。
- HTML 被设计用来显示数据,其焦点是数据的外观,旨在显示信息
二.Python对XML解析
1.XML接口简介
XML 常用的编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。
Python解析XML的三种方法:SAX,DOM,以及 ElementTree:
1.xml.dom.模块
一是xml.dom.模块,它是W3C DOM API的实现,若需要处理DOMAPI则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同;
2.xml.sax.模块
二是xml.sax.模块,它是SAXAPI的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存;
3.xml.etree.ElementTree模块
三是xml.etree.ElementTree模块(简称ET),它提供了轻量级的Python式的API,相对于DOM来说ET快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ET的ET.iterparse也提供了 “在空中”的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。
2.Python解析XML接口使用
示例XML文件
<?xml version="1.0" encoding="utf-8" ?>
<collection shelf="New Arrivals">
<world worldName="China">
<rank>1</rank>
<population>1400000000</population>
<history>5000</history>
</world>
<world worldName="America">
<rank>3</rank>
<population>0</population>
<history>200</history>
</world>
<world worldName="Russia">
<rank>2</rank>
<population>140000000</population>
<history>1100</history>
</world>
</collection>
例子中的根元素是 <collection>。文档中的所有 <world> 元素都被包含在 <collection> 中。
<world> 元素有3个子元素:<rank>、<history>、<population>。
1.SAX (simple API for XML )
代码:
import xml.sax class StudentHandler(xml.sax.ContentHandler): def __init__(self): self.rank = '' self.history = '' self.population = '' self.worldName = '' # 元素开始调用 def startElement(self, tag, attributes): self.CurrentData = tag # 元素结束调用 def endElement(self, tag): print() if self.CurrentData == 'rank': print('rank:', self.rank) elif self.CurrentData == 'history': print('history:', self.history) elif self.CurrentData == 'population': print('population:', self.population) elif self.CurrentData == 'worldName': print('worldName:', self.worldName) self.CurrentData = '' # 读取字符时调用 def characters(self, content): if self.CurrentData == 'rank': self.rank = content elif self.CurrentData == 'history': self.history = content elif self.CurrentData == 'population': self.population = content elif self.CurrentData == 'worldName': self.worldName = content if (__name__ == "__main__"): # 创建 XMLReader parser = xml.sax.make_parser() # 关闭命名空间 parser.setFeature(xml.sax.handler.feature_namespaces, 0) # 重写 ContextHandler Handler = StudentHandler() parser.setContentHandler(Handler) parser.parse('me.xml')
结果:
worldName: China rank: 1 population: 1400000000 history: 5000 worldName: America rank: 3 population: 0 history: 200 worldName: Russia rank: 2 population: 140000000 history: 1100
2.DOM(Document Object Model)
代码:
from xml.dom.minidom import parse import xml.dom.minidom # 使用minidom解析器打开XML文档 DOMTree = xml.dom.minidom.parse("me.xml") Data = DOMTree.documentElement if Data.hasAttribute("worldName"): print("worldName element : %s" % Data.getAttribute("worldName")) # 在集合中获取所有国家 worlds = Data.getElementsByTagName("world") # 打印每个国家的详细信息 for world in worlds: if world.hasAttribute("worldName"): print("worldName: %s" % world.getAttribute("worldName")) rank = world.getElementsByTagName('rank')[0] print("rank: %s" % rank.childNodes[0].data) history = world.getElementsByTagName('history')[0] print("history:%s" % history .childNodes[0].data) population = world.getElementsByTagName('population')[0] print("population: %s" % population.childNodes[0].data)
结果:
worldName: China rank: 1 history:5000 population: 1400000000 worldName: America rank: 3 history:200 population: 0 worldName: Russia rank: 2 history:1100 population: 140000000
3.ET(ElementTree)
代码:
try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET tree = ET.parse("me.xml") # 打开xml文档 root = tree.getroot() # 获得root节点 print(root.tag, "---", root.attrib) for child in root: print(child.tag, "---", child.attrib) print(root[1][2].text) # 通过下标访问 print(root[1].tag, root[2].text) for world in root.findall('world'): # 找到root节点下的所有country节点 rank = world.find('rank').text # 子节点下节点rank的值 name = world.get('history') # 子节点下属性name的值 print(world, rank)
结果:
collection --- {'shelf': 'New Arrivals'} world --- {'worldName': 'China'} world --- {'worldName': 'America'} world --- {'worldName': 'Russia'} 200 world <Element 'world' at 0x00000188988594A0> 1 <Element 'world' at 0x0000018898886B30> 3 <Element 'world' at 0x0000018898886C70> 2
写在最后
今天的文章就到这里,如果你觉得写的不错,可以动动小手给博主一个免费的关注和点赞👍;如果你觉得存在问题的话,欢迎在下方评论区指出和讨论。
谢谢观看,你的支持就是我前进的动力!