Python 读取xml文件

1 XML文件

XML 指的是可扩展标记语言(eXtensible Markup Language),和json类似也是用于存储和传输数据,还可以用作配置文件。类似于HTML超文本标记语言,但是HTML所有的标签都是预定义的,而xml的标签可以随便定义。

<!--注释-->
<book category="python">
    <title> xml test <\title>	
<\book>
  • XML元素指从开始标签到结束标签的部分(均包括开始和结束)
  • 一个元素可以包括:其它元素、属性、文本以及上述的混合

XML语法规则

  • 大小写敏感
  • xml 文档必须有根元素
  • 开始标签和结束标签不可省略
  • XML 必须正确嵌套,父元素必须完全包住子元素
  • XML属性值必须加引号,元素的属性值都是一个键值对形式

本案例数据主要采用了SMP 2019 |“拓尔思杯”中文隐式情感分析的数据

具体格式如下:

附件/Pasted image 20210901124006.png

2 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文件。

解析的基本过程:读到一个XML开始标签,就会开始一个事件,然后事件就会调用一系列的函数去处理 一个事情,当读到一个结束标签时,就会触发另一个事件。所以,我们写XML文档时 如果有格式错误的话,解析就会出错。这是一种流式处理,一边读一边解析,占用内存少。

适用场景如下:

  1. 对大型文件进行处理;
  2. 只需要文件的部分内容,或者只需从文件中得到特定信息。
  3. 想建立自己的对象模型的时候。

ElementTree

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

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)

3 minidom解析xml文件

主要采用 xml.dom.minidom进行操作

官方文档

#通过minidom解析xml文件
import xml.dom.minidom as xmldom
import os

xmlfilepath = os.path.abspath("train.xml")
domobj = xmldom.parse(xmlfilepath) # 得到文档对象
elementobj = domobj.documentElement # 得到元素对象
subElementObj = elementobj.getElementsByTagName("Doc") # 获得子标签
test_var = subElementObj[0].getElementsByTagName("Sentence") # 获得标签属性值
print(test_var[0].firstChild.data)
# 讨厌谁我就给对方买蒙牛!

#区分相同标签名的标签
caches = []
subElementObj1 = elementobj.getElementsByTagName("Doc")
for i in range(len(subElementObj1)):
    var = subElementObj1[i].getElementsByTagName("Sentence")
    cache = []
    for j in range(len(var)): 
        parameter = {"text":var[j].firstChild.data, "label":var[j].getAttribute("label")}
        cache.append(parameter)
    caches.append(cache)

print(caches[0])
# [{'text': '讨厌谁我就给对方买蒙牛!', 'label': ''}, 
# {'text': '别以为政治与你无关,有人送我蒙牛的产品我会以为对方要害我!', 'label': '2'}]

4 Python相关模块

Python 内置xml模块用于处理 XML 文件

xmltodict:xml 转 json

5 参考文献

CSDN-python操作xml
拓尔思官网

#XML #拓尔思杯 #文件读取

往年同期文章