Python处理XML文件

这篇具有很好参考价值的文章主要介绍了Python处理XML文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌲 前言

XML全称是Extensible Markup Language,中文名为可扩展标记语言。对xml的介绍可以看一下w3c的介绍。网络中数据传输的常见格式有json、xml、txt等。json很简单,xml稍微复杂,但是在python面前都不是事。
python有三种方式解析xml文档:SAX,DOM,以及 ElementTree(引自 菜鸟教程-Python XML解析),sax有些复杂,dom简单但是解析速度上不如sax。但是咱就是说,都选择Python了,肯定是想“更简单”。所以本文主要介绍python通过DOM方式对xml文件的解析读取、创建、修改等操作。
python有内置的模块:xml.dom(xml.dom官方文档)和xml.dom.minidom(xml.dom.minidom官方文档),本文主要使用xml.dom.minidom这个内置模块。


🌲 准备

xml.dom.minidom是dom的最小实现方式。以下是在python文件中需要导入的代码:

from xml.dom import minidom

🌲 xml.dom对象

众所周知,python是面向对象的,xml.dom解析xml文档之后会返回一系列对象,对对象的操作来获取信息。
xml.dom解析xml文件,将文件内容解析为DOM,以下是常见的dom中的对象:

对象 解释
DOMImplementation 创建新的xml时有用
Node 节点对象,文档中大多数对象的基本接口。像Element,Attr,Comment都继承自Node
NodeList 节点列表对象,一系列节点的接口。
DocumentType 文档类型对象,有关处理文档所需的声明的信息。
Document 文档对象,表示整个文档的对象。
Element 元素对象,文档层次结构中的元素节点。
Attr 属性,元素节点上的属性值节点。
Comment 注释对象,源文档中注释的表示形式。
Text 文本对象,包含文档中文本内容的节点

对XML文档的所有的操作都是基于DOM对象的操作

假如现在有一个xml文档,文档内容如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Library libraryname="市中心图书馆">
    <staff explanation="员工">
        <people gender="" name="小明"/>
        <people gender="" name="小花"/>
    </staff>
    <!-- 以下是书籍 -->
    <bookShelf name="人文类书架">
        <book isbn="****" date="2022-10-1">莎士比亚文集</book>
        <book isbn="****" date="2022-10-2">童话故事</book>
    </bookShelf>
    <bookShelf name="自然类书架">
        <book isbn="****" date="2022-10-1">python程序设计</book>
        <book isbn="****" date="2022-10-2">C++程序设计</book>
    </bookShelf>
</Library>

整个文档为Document
<Library>,<staff>,<book>, <!-- -->,甚至元素的属性都是Node,多个Node组成Node List
但是,更确切的说<Library>,<staff>,<book>是Element,继承自Node。
<!-- -->是Comment,也继承自Node。
其中的“莎士比亚文集”属于Text

1. Document

如果你想解析一篇xml文档,那么获取Document是解析的第一步。document包括从根到叶的所有内容
解析文档获取document对象:

from xml.dom.minidom import parse # 这个用来解析xml文档
# from xml.dom.minidom import parseString # 这个用来解析xml字符串
doc = parse("./test.xml")

document的方法和属性如下:

属性/方法 参数 返回值 解释
documentElement / Element 返回根节点,根节点只能有一个
getElementsByTagName() str NodeList 搜索所有的子节点
createElement() str Element 创建新元素节点
createTextNode() str Text 创建文本节点
createComment() str Comment 创建注释节点
createAttribute() str Attr 创建属性节点

2. Node

很多对象都是继承自Node,下面是一些Node的方法或者属性

属性/方法 参数 返回值 解释
nodeType / int 返回节点的类型
nodeName / str 获取节点名称,一般用于获取element名称
nodeValue / str 获取节点值,一般用于获取注释值
childNodes / NodeList 返回所有类型的节点
firstChild / Node 得到第一个节点
lastChild / Node 得到最后一个节点
hasAttributes() / bool 判断是否有属性
hasChildNodes() / bool 判断是否有子节点
appendChild() Node Node 添加节点
removeChild() Node Node 删除节点
replaceChild() Node,Node Node 替换节点

3. NodeList

使用getElementsByTagName()函数通常返回的是Node列表,

属性/方法 参数 返回值 解释
length / int 返回包含Node的数量
item() int Node 返回第i个Node

4. Element

Element对象时我们操作最频繁的对象,我们查找元素内容时,往往都是通过getElementsByTagName()来获取元素,再通过Element的一些方法来获取内容。

属性/方法 参数 返回值 解释
tagName / str 元素的名称
attributes / NodeMap 返回多个属性对象,类型是字典,遍历的时候要注意
getElementsByTagName() str ElementList 从名字获取元素
hasAttribute() str bool 判断是否有这个属性
getAttribute() str str 获取属性的值
getAttributeNode() str Attr 返回属性节点
removeAttribute() str 删除属性
setAttribute() str(属性名),str(属性值) 设置属性

5. Attr

属性 返回值 解释
name str 属性名称
value str 属性值

🌲 解析xml文档

对已有的xml文档处理,无非是查找信息、增添内容、删除内容、更改内容的操作。

1.查找内容

from xml.dom import minidom
from xml.dom.minidom import parse
doc=parse("./test.xml")

1.1 获取根元素:

root=doc.documentElement

# 获取根元素名称
root.tagName  # 或者: root.nodeName

# 获取根元素类型
root.nodeName # 输出的是元素类型

1.2 查找子元素:

查找子元素是主要针对元素来讲的,下面的element指的是xml文档中的Element对象

# 获取元素下面的所有子元素数量
element.childNodes.length

# 遍历元素下面的所有子元素
for child_node in element.childNodes:
    print("节点类型",child_node.nodeType)
    print("节点名称",child_node.nodeName)
    
# 获取元素下的位置为i的子节点(注意这是“节点”,不是“元素”;节点包括注释)
child_node =element.childNodes.item(i)

# 根据元素名查找
elements=root.getElementsByTagName("bookShelf")
# 遍历
for element in elements:
    print("元素名称:",element.tagName)
# 从ElementList找位置为i的元素
print("i处位置的元素:",elements[i]) # 或者elements.item(i)

1.3 获取元素的属性:

# 获取元素的所有属性对象
element.attributes # 返回的对象可以像字典一样遍历,想获取属性的名称和值需要遍历

# 遍历元素下的所有属性的名称和值
for key,value in element.attributes.items(): # 像字典一样遍历
    print("属性名:",key)
    print("属性值:",value)

# 获取特定属性
element.getAttribute("attr_name") 

1.4 获取文本

如果想获取book元素中的“莎士比亚文集”文本内容,需要通过Text对象操作。

<book isbn="****" date="2022-10-1">莎士比亚文集</book>

Text对象本质上还是Node对象,可以使用firstChild()来获得。

elements=root.getElementsByTagName("book")
for element in elements:
    print("元素里的文本内容:",element.firstChild.data) # 或者是element.firstChild.nodeValue
    break # 只显示第一个book元素中的文本

2. 增加内容

创建内容需要使用document的create***()方法创建。然后将创建好的子节点使用元素的append()添加进去。
元素添加属性,需要使用setAttribute()
以下是向第一个bookshelf添加一本book元素的例子

doc=parse("./test.xml")
bookShelf1=doc.getElementsByTagName("bookShelf")[0]
new_book=doc.createElement("book")
new_book.setAttribute("isbn","******")
new_book.setAttribute("date","2022-10-3")
new_book.appendChild(doc.createTextNode("鲁迅全集"))
bookShelf1.appendChild(new_book)

最后需要将编辑的结果保存在文档中:

with open("test.xml", "w", encoding="utf-8") as f:
    doc.writexml(f, indent='', addindent='\t', newl='\n', encoding="utf-8")

添加注释同理

3. 删除内容

删除节点需要使用节点对象的removeChild();删除属性需要使用元素对象的removeAttribute()。
以下是删除刚添加的《鲁迅文集》这本书

bookShelf1=doc.getElementsByTagName("bookShelf")[0]
book_delete=bookShelf1.getElementsByTagName("book").item(2) # 把刚才的鲁迅文集这本书删除
bookShelf1.removeChild(book_delete)

删除之后别忘了保存到文件

4. 更新属性

更新节点可以使用节点对象的replace()方法;更改属性还是使用setAttribute()


🌲 创建xml文档

前面所述都是在已有xml文档的情况下操作。但是想新建一个新的xml文档怎么办?需要使用DOMImplementation来创建一个新document,然后使用writexml()保存就可以

例子:

from xml.dom.minidom import getDOMImplementation

impl = getDOMImplementation()

doc_new = impl.createDocument(None, "top", None)
root = doc_new.documentElement
text = doc_new.createTextNode('内容')
root.appendChild(text)
# 保存
with open("new.xml", "w", encoding="utf-8") as f:
    doc_new.writexml(f, indent='', addindent='\t', newl='\n', encoding="utf-8")

最后生成的结果如下:文章来源地址https://www.toymoban.com/news/detail-695334.html

<?xml version="1.0" encoding="utf-8"?>
<top>内容</top>

到了这里,关于Python处理XML文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python批量修改、删除、替换xml文件内容(labelimg标注)

    使用模型训练自定义数据集之前,在用在网上搜索得到的图片制作数据集时,即使批量修改图片名称后,在使用labelimg标注得到的xml文件中,图片名称还是网络上图片原本的名称,这时需要对其进行批量修改。 然后先修改路径,将xml文件对应图片的真实路径替换。这里图片的

    2023年04月15日
    浏览(78)
  • 使用 Python、XML 和 YAML 编写 ROS 2 Launch 文件

    ROS2 重要概念 ament_cmake_python 用户文档 ROS2 ament_cmake 用户文档 使用 rosdep 管理 ROS 2 依赖项 ROS 2 launch 文件可以用 Python、XML 和 YAML 编写。本指南介绍了如何使用这些不同的格式来完成相同的任务,并对何时使用每种格式进行了讨论。 下面是一个用 Python、XML 和 YAML 实现的 Launc

    2024年02月05日
    浏览(32)
  • 【医学影像数据处理】 XML 文件格式处理汇总

    xml(Extensible Markup Language,简称:XML) 可扩展标记语言,是一种 netconf 配置文件的格式。是一种固有的分层数据格式,最自然的表示方式是解析成树状。 但是, xml 这样的标签数据,是 面向“机器”识别的,是不利于“人类”识别的 ,所以看起来会比较的麻烦。 2003年5月成

    2024年02月08日
    浏览(35)
  • 38.Python从入门到精通—Python3 XML 解析 什么是 XML Python 对 XML 的解析

    XML(可扩展标记语言)是一种用于描述数据的标记语言,它可以用于表示各种类型的数据,包括文本、图像、音频、视频等。XML 的语法类似于HTML,但它更加灵活,可以自定义标记,并且不依赖于任何特定的应用程序或操作系统。 XML的基本结构由元素、属性和文本组成。元素

    2024年04月11日
    浏览(29)
  • Python 获取 IOS/Iphone/Ipad等设备拍摄的HEIC图片的拍摄地址/坐标/位置以及python的googleEarth的xml文件绘制初步

    出去旅游,用iphone拍了非常多的照片,心想这些照片都有位置信息和拍摄时间信息,那能不能用python制作一个程序,输入所有照片,然后读取这些信息,最后输出一个xml路径文件,打开在googleEarth看。虽然最近逐步奉行“不讨论意义主义”,但我觉得此举的意义,首先是折腾

    2024年02月21日
    浏览(45)
  • python 之xml 使用原生xml.dom

    一、xml操作 使用xml进行创建 二、获取值、修改值 直接获取数据 通过父节点定义子节点 并获取值 重新赋值 添加子节点 三、将一个xml文档,插入另一文档中(将一个节点值插入另一个节点) 将一个xml文档某个元素插入另一个文档,插入另一文档中 将另个文档中的节点,插入指

    2024年02月07日
    浏览(26)
  • Python操作XML教程:读取、写入、修改和保存XML文档

    XML是一种常见的数据交换格式,在许多应用中都被广泛使用。通过掌握Python操作XML的基础知识,您将能够轻松地处理XML数据,从而实现数据的提取、修改和存储。 内容包括以下主要部分: 解析XML文档:学习如何使用Python解析XML文档,获取根元素和遍历子元素。 访问元素的内

    2024年02月13日
    浏览(38)
  • Python提取xml节点

    xml.etree.ElementTree 是 Python 标准库中的模块,用于解析和处理 XML 数据。它提供了一种简单的方式来解析 XML 文件并将其表示为树结构,使得可以方便地遍历和操作 XML 数据。 要使用 xml.etree.ElementTree 模块,你可以导入它并使用其中的函数和类来处理 XML 数据。以下是一些常见的

    2024年02月22日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包