python xml第三方库_python解析.xml文件-- xmltodict模块(第三方)

本文介绍了XML的基本概念、特点、用途及语法规则,并详细讲解了Python中DOM、SAX和ElementTree三种解析XML的方法。通过示例展示了如何使用xmltodict模块将XML转换为字典并进行数据提取。最后,给出了一个具体需求的实现,从XML文件中提取特定标签内容并存储为字典列表。
摘要由CSDN通过智能技术生成

第一part:XML文件介绍

1.XML的定义: 指可扩展标记语言(EXtensible Markup Language)。

2.XML的特点:

1)XML 是一种很像HTML的标记语言;

2)XML 的设计宗旨是传输数据,而不是显示数据;

3)XML 标签没有被预定义,需要自行定义标签;

4)XML 被设计为具有自我描述性;

5)XML 是 W3C 的推荐标准。

3.XML的用途:

1)XML把数据从HTML分离;

2)XML简化数据共享;

3)XML简化数据传输;

4)XML简化平台变更;

5)XML使您的数据更有用;

6)XML用于创建新的互联网语言。

4.XML的文件内容结构:

元素:指从开始标签到结束标签的部分(均包括开始和结束),一个元素可以包括:子元素,属性和文本。

子元素

属性

文本

12

5.XML语法规则:

1)所有的元素都必须有开始标签和结束标签,省略结束标签是非法的;

2)大小写敏感,(比如:和是两个不同的标签;

3)xml文档必须有根元素;

4)XML必须正确嵌套,父元素必须完全包住子元素;

5)XML属性值必须加引号,元素的属性值都是一个键值对形式。

第二part:Python对XML的解析的方法

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

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

1)DOM(Document Object Model):

DOM的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后利用DOM提供的不同函数来读取该文档的内容和结构,也可以把修改过的内容写入XML文件。由于DOM是将XML读取到内存,然后解析成一个树,如果要处理的XML文本比较大的话,就会很耗内存,所以DOM一般偏向于处理一些小的XML,(如配置文件)比较快。

2)SAX(simple API for XML):

Python标准库中包含SAX解析器,SAX是用的是事件驱动模型,通过在解析XML过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

3)ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

xml.dom解析XML详解介绍:

1)先定义一个data4.xml文件,如下:

2114399-20201008222839167-671557319.png

2)安装xmltodict第三方模块:安装的方式有两种,一种是通过命令行 pip install xmltodict;第二种是通过pycharm的settings中搜索安装该模块

3)解析代码:

#导包

import xmltodict

import json

with open("data4.xml",encoding="utf-8") as fp:

# 参数可以是字符串也可以是文件流对象

get_xml=xmltodict.parse(fp.read())

print(get_xml)

print("根标签的属性:",get_xml["people_info"]['@name'])

print("根标签下people_1子标签hegiht属性值:",get_xml["people_info"]["people_1"]["@height"])

fp.seek(0)

#可以直接将结果转换成json格式

print(json.dumps(xmltodict.parse(fp.read()),ensure_ascii=False))

执行结果如下:

2114399-20201008224241409-336976767.png

4)需求:需要对data4.xml文件中的所有根标签下的以people开头的子标签文本内容全部以字典的形式定义成一组数据,最后全部写入到一个列表中;代码如下:

#导包

import xmltodict

import json

def get_xml_data(input):

'''

:param input: 传入键的开头值

:return:

'''

list1=[]

with open("data4.xml",encoding="utf-8") as fp:

#解析xml得到字典格式;存在根标签

get_result=json.loads(json.dumps(xmltodict.parse(fp.read()),ensure_ascii=False))

#取到根标签的值然后进行遍历键和值,然后再根据键以people开头的标签取出对应的值

for key,value in list(get_result.values())[0].items():

dict1={}

if str(key).startswith(input):

#子标签可能存在属性,属性一般通过xmltodict转换后得到的通常都是以@开头的

for get_key,get_value in value.items():

if not str(get_key).startswith("@"):

dict1[get_key]=get_value

list1.append(dict1)

return list1

#调用测试代码

print(get_xml_data("people"))

执行结果,如下:

2114399-20201008223607119-1880946935.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值