XML文件格式的简介及如何用Python3处理XML格式对象

news2025/3/15 9:45:30

诸神缄默不语-个人技术博文与视频目录

文章目录

  • 1. XML格式简介
  • 2. 格式化XML文件的工具
  • 3. Python处理XML:xml库
    • 1. xml.etree.\(c\)ElementTree
    • 2. xml.dom.minidom
  • 4. 本文撰写过程中参考的其他网络资料

1. XML格式简介

可扩展标记语言 (Extensible Markup Language, XML)

总之也是一种用来定义数据规范的纯文本格式。呃但是也可以拿来按这种规范来存储数据。
大小写敏感。

示例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="osg.AndroidExample"
      android:installLocation="preferExternal"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"></uses-sdk>
    <uses-feature android:glEsVersion="0x00020000"/> <!-- OpenGL min requierements (2.0) -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <application android:label="@string/app_name" android:icon="@drawable/osg">
        <activity android:name=".osgViewer"
                  android:label="@string/app_name" android:screenOrientation="landscape"> <!--  Force screen to landscape -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

格式上有点类似于HTML,由XML元素组成,每个XML元素包括一个开始标记(<factor_name>),一个结束标记(</factor_name>)以及两个标记之间的内容。
有且只有一个根元素。就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。

XML声明是XML文档的第一句,其格式如下:
<?xml version="1.0" encoding="utf-8"?>

所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号)。

2. 格式化XML文件的工具

在线格式化:https://c.runoob.com/front-end/710/

也可以用VSCode上的这个插件:
在这里插入图片描述
安装后打开XML文件时,在窗口中右键选择“Format Document”就能格式化XML文件。

3. Python处理XML:xml库

本节各小节用的原XML文件都大致长这样:
在这里插入图片描述
实际上是从C:\Users\user_name\AppData\Roaming\Tencent\WeChat\3\host里面随便抓的一个XML文件。

1. xml.etree.(c)ElementTree

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

cElementTree是用C写的更快的实现。接口用法看起来都是一样的。

模块的类:
ElementTree:是一个层级式的XML元素。
ElementTree.Element(tag)是一个XML元素。

模块函数:
ElementTree.SubElement(parent,tag):为XML元素增加一个子元素,返回这个子元素(一个Element实例)。
ElementTree.parse(xml_file_path):解析一个XML文档为ElementTree对象

ElementTree对象的函数:
getroot():返回根元素(一个Element实例)
write(file_or_filename,encoding)

Element对象的属性:
tag
text

Element对象的方法:
findall(tag):返回当前Element对象的指定tag的所有子元素(一个Element的迭代器)
find(tag):返回当前Element对象的指定tag的第一个子元素(一个Element对象)
append(subelement:Element):给当前Element对象增加一个子元素(一个Element对象)

示例代码:

按照指定tag查询子元素的子元素的第一个子元素的text的代码示例:

import xml.etree.ElementTree as ET

tree = ET.parse(r'trys\example.xml')
root=tree.getroot()
for function in root.findall('function'):
    for domainlist in function.findall('domainlist'):
        domain=domainlist.find('domain')
        print(domain.text)
        break
    break

输出:long.weixin.qq.com

↑注意在这里我们可以发现xml对象中,每一层只能检索(不管是用find还是findall)当前对象的属性,就是说如果你跨级检索就检索不到。

在现成的XML文件中增加一个子元素的代码示例:

import xml.etree.ElementTree as ET

tree = ET.parse(r"trys\example.xml")
root = tree.getroot()
book = ET.Element("book")
title = ET.SubElement(book, "title")
title.text = "机器学习"
root.append(book)
tree.write(r"trys\example2.xml", encoding="utf-8")

输出XML文件最后的内容示例(注意这是我用XML插件格式化后的效果):
在这里插入图片描述

2. xml.dom.minidom

官方文档:https://docs.python.org/3/library/xml.dom.minidom.html

模块类:
Document
Element
Node
Text

模块函数:
parseString(string):将XML字符串转化为xml.DOM(Document对象)

Document对象的属性:
documentElement:获取DOM的根元素

Document对象的函数:
writexml(file_writer:TextIOWrapper,indent:str,addindent:str,newl:str):将DOM写入文本文件,所以此处的TextIOWrapper需要是可写的。

Element对象的属性:
childNodes:理论上是返回子节点列表(xml.dom.minicompat.NodeList对象),每个元素是一个Node,但是事实上会直接实例化成具体的Node分类(如示例中的Text对象)。这个好像只在没有子元素的元素里才有用,可以从其第一个元素里获得data属性,这个就是Element对象的文本。具体的可以见示例代码

Element对象的函数:
getElementsByTagName(tag):获取当前Element对象所有指定tag的子元素,返回一个xml.dom.minicompat.NodeList对象,这个对象是可以用索引直接获取每个元素(Element实例)的
getAttribute(attname):根据属性名获取当前Element的属性值

Text对象的属性:
data:文字
nodeType:3(Node.TEXT_NODE的值)

Node对象的属性:
在这里插入图片描述

示例代码,简单版:

from xml.dom.minidom import parseString

xml_str=open(r"trys\example.xml",encoding="utf-8").read()
doc=parseString(xml_str)
functionlist=doc.documentElement

function_iterator=functionlist.getElementsByTagName("function")
function1=function_iterator[0]  #xml.dom.minidom.Element对象
print(function1.getAttribute("name"))  #输出:basic

domain_lists=function1.getElementsByTagName("domainlist")
domain_list1=domain_lists[0]

domains=domain_list1.getElementsByTagName("domain")
domain1=domains[0]

childnodes=domain1.childNodes  #xml.dom.minicompat.NodeList对象
the_childnode=childnodes[0]  #xml.dom.minidom.Text对象
print(the_childnode.nodeType)  #输出:3
print(the_childnode.data)  #输出:long.weixin.qq.com

在真实项目中的使用代码可以参考我的另一篇博文:如何用Python 3调用ArXiv API查询ArXiv论文元数据

4. 本文撰写过程中参考的其他网络资料

  1. 可扩展标记语言_百度百科
  2. XML到底是干什么的? - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过qemu仿真树莓派系统调试IoT固件和程序

通过qemu仿真树莓派系统调试IoT固件和程序 本文将介绍如何使用 QEMU 模拟器在 x86 架构的主机上运行 Raspberry Pi OS&#xff08;树莓派操作系统&#xff09;。我们将从下载镜像、提取内核和设备树文件&#xff0c;到启动模拟环境&#xff0c;并进行一些常见的操作&#xff0…

Oracle底层原理解析

Oracle 解析 1、union \ union all \ Intersect \ Minus内部处理机制&#xff08;优化&#xff09; 当查询语句中的where子句中使用到or时&#xff0c;可以用union all来代替。因为使用or查询语句的时候&#xff0c;引起全表扫描&#xff0c;并走索引查询 特别&#xff1a;当…

深度解读DeepSeek部署使用安全(48页PPT)(文末有下载方式)

深度解读DeepSeek&#xff1a;部署、使用与安全 详细资料请看本解读文章的最后内容。 引言 DeepSeek作为一款先进的人工智能模型&#xff0c;其部署、使用与安全性是用户最为关注的三大核心问题。本文将从本地化部署、使用方法与技巧、以及安全性三个方面&#xff0c;对Deep…

【前端三剑客】万字总结JavaScript

一、初识JavaScript 1.1 JavaScript 的作用 表单动态校验&#xff08;密码强度检测&#xff09; &#xff08; JS 产生最初的目的 &#xff09;网页特效服务端开发(Node.js)桌面程序(Electron)App(Cordova)控制硬件-物联网(Ruff)游戏开发(cocos2d-js) 1.2 HTML/CSS/JS 的关系…

【哈希表与字符串的算法之路:思路与实现】—— LeetCode

文章目录 两数之和面试题01.02.判定是否为字符重排存在重复元素存在重复元素||字母异位词分组最长公共前缀和最长回文子串二进制求和字符串相乘 两数之和 这题的思路很简单&#xff0c;在读完题目之后&#xff0c;便可以想到暴力枚举&#xff0c;直接遍历整个数组两遍即可&…

Hello Mr. My Yesterday日文歌词附假名注音,祭奠逝去的青春

hello mr. my yesterday Hundred Percent Free Hello Mr. my yesterday云っておくれよ “夢叶うその瞬間にまた逢える”と 前方の幾多前途多難の未知 後方の道後悔も知った 経験と価値 夢なかば 一本の道結果だが ひとつだけ知りたいよ 神様がいるのなら “幸せの定義っ…

ubuntu ollama+dify实践

安装ollama 官网的指令太慢了&#xff0c;使用以下指令加速&#xff1a; export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download" curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/dow…

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例 前期概要: S7-1200 G2必须基于TIA博途V20,之前的程序可通过移植的方式在新硬件上使用。 该移植工具可自动将TIA Portal 项目从 S7-1200 移植到更新的S7-1200 G2。 注意: 该插件支持在同一TIA Portal项目实例内将软件和/或硬…

新办公室哪款空气净化器除甲醛效果好?高效除甲醛,提升效率

现代办公环境中&#xff0c;空气质量对员工的健康与工作效率产生着不可忽视的影响。尤其是新装修的办公室&#xff0c;往往因为空气中的甲醛浓度超标而导致一系列健康问题。因此&#xff0c;选择一款性能优越的除甲醛空气净化器就显得尤为重要。合适的空气净化器不仅可以有效过…

大视频背景暗黑风格的wordpress企业主题免费下载

整体风格是黑色的&#xff0c;首页首屏大视频背景&#xff0c;动态效果非常好。向下滚动时&#xff0c;滚动的特效也不错。 原文 https://www.bixugao.com/wp/26.html

C语言基础知识04

指针 指针概念 指针保存地址&#xff0c;地址是字节的编号 指针类型和保存的地址类型要一直 使用时注意&#xff0c;把地址转换为&变量的格式来看 int a[3]; a转为&a[0] 指针的大小 64bit 固定8字节&#xff0c; 32bit 固定4字节 指针…

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…

android lmkd.rc 介绍

service service lmkd /system/bin/lmkdclass coreuser lmkdgroup lmkd system readproccapabilities DAC_OVERRIDE KILL IPC_LOCK SYS_NICE SYS_RESOURCEcriticalsocket lmkd seqpacketpasscred 0660 system systemtask_profiles ServiceCapacityLow属于核心服务组&#xff0…

Matlab 双线性插值(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 双线性插值是一种 二维插值方法,用于计算 栅格(Grid) 或 像素点 之间的插值值。它主要用于 图像缩放、旋转、变换 等操作,以在新像素位置估算灰度值或颜色值。 如上图所示,假设存在一个二维离散函数(如图像)…

TCP 三次握手四次挥手过程详解

注&#xff1a;本文为 “TCP 的三次握手与四次挥手” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;未整理去重。 英文引文第二篇&#xff0c;实为国内《稀土掘金技术社区》文章&#xff0c;没检索到原文&#xff0c;此处 “出口转内销” 。 如有内…

程序编译生成的文件

目录 .i 文件 .s 文件 .o文件 总结 在 C 编程中&#xff0c;.i、.s和 .o 文件是编译过程中生成的不同阶段的文件&#xff0c;它们代表不同的含义&#xff1a; .i 文件 全称 &#xff1a;预处理后的文件&#xff08;Intermediate File&#xff09;。 含义&#xff1a;.i文件…

C++类的基础题(4)

练习1&#xff1a;&#xff08;简单&#xff09; 基于如下程序&#xff0c;按要求修改和完善。 #include <iostream> using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {numn;scores;} void displ…

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架&#xff0c;通过合成自挑战问题来增强视觉-语言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练&#xff0c;显著提升了模型在推理深度和广度上的表…

WPS 搭配 Zotero 插件使用

安装Zotero后&#xff0c;Word自动引入了插件&#xff0c;但WPS却没有&#xff0c;做为WPS的重度用户&#xff0c;这是不行的。 解决方案&#xff1a; 1.找到 Zotero.dotm 一般在安装目录下&#xff0c; 2.然后复制到WPS的startup下 我的目录是&#xff1a;C:\Users\lianq…

汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响

引言 失去发动机的掩蔽效应后&#xff0c;新能源电车的NVH问题&#xff0c;成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别&#xff0c;根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源&#xff1f;今天分享的这个案例&#xff0c;内…