Python学习21天学习挑战赛Day5之XML解析

   活动地址:CSDN21天学习挑战赛

作者简介:大家好我是Apathfinder,目前是一名在校大学生,软件工程专业,记录学习路上的点点滴滴。
个人主页:Apathfinder

本文专栏:Python学习

前言:本文是对XML语言的基本介绍以及基础使用。

目录

正文

一.XML简介

1.什么是XML

2.XML的用途

3.XML 和 HTML 之间的差异 

二.Python对XML解析

1.XML接口简介

        1.xml.dom.模块

        2.xml.sax.模块

        3.xml.etree.ElementTree模块

2.Python解析XML接口使用

        1.SAX (simple API for XML )

        2.DOM(Document Object Model)

        3.ET(ElementTree)    

写在最后



正文

一.XML简介

1.什么是XML

  • XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
  • XML 被设计用来传输存储数据。
  • XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。
  • XML 是一种类似HTML的标记语言。
  • XML 的设计宗旨传输数据,而不是显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。
  • XML也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

2.XML的用途

        XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。  

  1. 把数据从 HTML 分离
  2. 简化数据共享
  3. 简化数据传输
  4. 简化平台的变更
  5. 用于创建新的 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


写在最后

        今天的文章就到这里,如果你觉得写的不错,可以动动小手给博主一个免费的关注和点赞👍;如果你觉得存在问题的话,欢迎在下方评论区指出和讨论。
谢谢观看,你的支持就是我前进的动力!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apathfinder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值