1.3.6 python解析xml文件数据

本文介绍了XML的基本概念、用途和语法规则,并详细讲解了Python中DOM、SAX和ElementTree三种方式解析XML的原理和示例。通过案例展示了如何使用Python内置库和第三方库xmltodict解析XML文件。
摘要由CSDN通过智能技术生成

XML简介

 

  • XML 指可扩展标记语言(EXtensible Markup Language)。

  • XML 是一种很像HTML的标记语言。

  • XML 的设计宗旨是传输数据,而不是显示数据。

  • XML 标签没有被预定义。您需要自行定义标签。

  • XML 被设计为具有自我描述性。

  • XML 是 W3C 的推荐标准。

XML用途

  • XML把数据从HTML分离

  • XML简化数据共享

  • XML简化数据传输

  • XML简化平台变更

  • XML使您的数据更有用

  • XML用于创建新的互联网语言

XML元素

     指从开始标签到结束标签的部分(均包括开始和结束)
      一个元素可以包括:

  • 子元素

<student>  <name></name></student>
  • 属性

<student id=’1’></student>
  • 文本

<name>zhangsan</name>

 

XML语法规则

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

  • 大小写敏感,以下是两个不同的标签。

  • xml文档必须有根元素。

  • XML必须正确嵌套,父元素必须完全包住子元素。

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

Python对XML的解析

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

  • DOM(Document Object Model)

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

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

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

xml.dom解析XML

已定义好xml文件Student_Info.xml,其内容如下:

解析以上xml文档代码如下:

#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName:       Python2020#FileName:          Dom_Xml.py#Author:            mutou#Date:              2020/5/31 17:55#Description:通过dom对象完成xml文件的数据读取操作#--------------------------------------------------------------------------from  xml.dom.minidom  import parse#获取dom对象get_dom_tree=parse("Student_Info.xml")print(type(get_dom_tree))#获取到element对象,即可获取当前元素的所有信息student_info=get_dom_tree.documentElement#获取到标签名print(student_info.tagName)#获取属性print(student_info.getAttribute("name"))#调用子节点:已经获取到根节点的dom对象print(get_dom_tree.firstChild)print(get_dom_tree.lastChild.tagName)print(get_dom_tree.childNodes)#上面获取全部使当前节点的相关信息for value in get_dom_tree.getElementsByTagName("student_1"):  #getElements返回的是一个nodelist    print("输出的结果值是:",value.tagName)    print(value.getAttribute("score"))#必须搞清楚以下几个对象:Document object、Element  Object、Node object、NodeList  object

上述代码总结

  • 加载读取xml文件:parse(xml文件名)

  • 获取xml文档对象:doc.documentElement

  • 获取XML节点属性值:node.getAttribute(AttributeName)

  • 获取XML节点对象集合:node.getElementsByTagName(TagName)

  • 返回子节点列表:node.childNodes

  • 获取XML节点值:node.childNodes[index].nodeValue

  • 访问第一个节点,等价于pagexml.childNodes[0]:node.firstChild

  • 返回Node节点的xml表示的文本:doc.toxml(‘UTF-8’)

  • 访问元素属性:Node.attributes[“id”]

  • 节点的名称:root.nodeName/root.tagName

  • 节点的值,文本节点才有值,其它节点返回的是None:root.nodeValue

  • 节点的类型:root.nodeType

dom解析主要涉及以下几个核心对象:文本对象、元素对象、节点对象、节点列表对象等;具体详情参考对应的api:如下

python第三方库解析xml

       python内置的模块解析xml较为复杂,所以可以引用第三方库完成简易解析,解析xml的第三方库较多,例如:

库/函数描述推荐度

lxml

[第三方库]xml和HTML读取和解析

★★★

libxml2

[第三方库]xml对象解析和格式化处理

xpath

[第三方库]xml对象解析和格式化处理

★★

untangle[第三方库]将XML文档映射为一个Python 对象★★
xmltodict[第三方库]将XML文档映射为一个Python 对象★★★

xmltodict使用

直接使用pip  install xmltodict进行安装;

如果需要解析上述Student_Info.xml文件,则代码如下:​​​​​​​

#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName:       Python2020#FileName:          XmlToDictTest.py#Author:            mutou#Date:              2020/5/31 18:24#Description:#--------------------------------------------------------------------------import xmltodictimport jsonwith open("Student_Info.xml",encoding="utf-8") as fp:    get_xml=xmltodict.parse(fp.read())  #第一个参数xml_input可以是字符串也可以是文件流对象    print(get_xml)    print("根标签的属性:",get_xml["student_info"]['@name'])    print("根标签下student_1子标签score属性值:",get_xml["student_info"]["student_1"]["@score"])    fp.seek(0)    #可以直接将结果转换成json格式    print(json.dumps(xmltodict.parse(fp.read()),ensure_ascii=False))

执行结果如下:

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

#-*- coding:utf-8 -*-##-------------------------------------------------------------------------#ProjectName:       Python2020#FileName:          HomeWorkTest.py#Author:            mutou#Date:              2020/6/2 20:41#Description:student开头中的每个标签的内容全部遍历出来,并且每个student标签下面的内容为一组值放到字典中#--------------------------------------------------------------------------import xmltodictimport jsondef get_xml_data(input):    list1=[]    with open("Student_Info.xml",encoding="utf-8") as fp:        #解析xml得到字典格式;存在根标签        get_result=json.loads(json.dumps(xmltodict.parse(fp.read()),ensure_ascii=False))        #取到根标签的值然后进行遍历键和值,然后再根据键以student开头的标签取出对应的值        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("student"))

执行结果如下:

 

了解更多信息关注公众号

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zemuerqi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值