Python 第三方模块之 ElementTree(ET)- 解析XML文件

ElementTree是Python常用的处理XML文件的类。下面将介绍使用ElementTree解析、查找、修改XML的方法。

1、引用方法

import xml.etree.ElementTree as ET

2、一个XML例子

下面所有的操作都将下面这段XML为例,我们将它保存为sample.xml。

<?xml version="1.0"?>
<data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc><neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year><gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> 
</data>

先对XML的格式做一些说明:
    Tag: 标签,如country标签
    Element:被Tag包围的部分,值,如 68,2011 等
    Attribute:标签的属性,如country标签的name

3、解析XML

3.1 读取

读入XML数据有三种途径,从文件读入和从字符串读入,文件读入有2种

1、python3.3之后ElementTree模块会自动寻找可用的C库来加快速度

import xml.etree.ElementTree as ETtree = ET.parse('sample.xml')
root = tree.getroot()

2、调用ElementTree类ElementTree(self, element=None, file=None) # 这里的element作为根节点

import xml.etree.ElementTree as ETtree = ET.ElementTree(file="country.xml")
root = tree.getroot()  # <Element 'data' at 0x030EA600>

3、从字符串读入:

import xml.etree.ElementTree as ETdata = open("country.xml").read()
root = ET.fromstring(data)
# root = ET.fromstring(sample_as_string)

3.2 查看Tag和Attribute

# 当要获取属性值时,用attrib方法。 返回一个字典,如
print(root.attrib)
# 可以Element.get(AttributeName)来代替Element.attrib[AttributeName]来访问。# 当要获取节点值时,用text方法。返回一个字符串,如
print(root.text)# 当要获取节点名时,用tag方法。 返回一个字符串,如
print(root.tag)

3.3 查看孩子

.root.attrib返回的是一个空字典,如果看root的孩子,可以得到非空的attrib字典。

1、使用for...in...查询根节点下二级节点的所有元素

print(root.tag)# 根节点标签
for child in root:print(child.tag,child.attrib)  # 二级节点标签、属性、内容,结果得到
# country {'name': 'Liechtenstein'}
# country {'name': 'Singapore'}
# country {'name': 'Panama'}

2、使用findall等查询根节点下的元素

Element.iter()用来寻找所有符合要求的Tag,注意,这里查找的范围是所有孩子和孩子的孩子 and so
Element.findall()只查找直接的孩子,返回所有符合要求的Tag的Element
Element.find()只返回符合要求的第一个Element。如果查看Singapore的year的值

for child in root.findall('.//country'):print(child.tag,child.attrib)

4、修改XML

前面已经介绍了如何获取一个Element的对象,以及查看它的Tag、Attribute、值和它的孩子。下面介绍如何修改一个Element并对XML文件进行保存

修改Element。修改Element可以直接访问Element.text。

import xml.etree.ElementTree as ET# 修改Element的Attribute,也可以用来新增Attribute:
ET.Element.set('AttributeName','AttributeValue')# 新增孩子节点:
root.append(childElement)# 删除孩子节点:
root.remove(childElement)

保存XML。我们从文件解析的时候,我们用了一个ElementTree的对象tree,在完成修改之后,还用tree来保存XML文件。

tree.write('output.xml')

构建XML。ElementTree提供了两个静态函数(直接用类名访问,这里我们用的是ET)可以很方便的构建一个XML,如:

import xml.etree.ElementTree as ETroot = ET.Element('data')
country = ET.SubElement(root,'country', {'name':'Liechtenstein'})  # root 增加 country 节点
rank = ET.SubElement(country,'rank')  # country 增加 rank 节点
rank.text = '1'
year = ET.SubElement(country,'year')  # country 增加 year节点
year.text = '2008'
ET.dump(root)

5、XPath支持

XPath表达式用来在XML中定位Element,下面给一个例子来说明:

import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)# Top-level elements
root.findall(".")
# All 'neighbor' grand-children of 'country' children of the top-level
# elements
root.findall("./country/neighbor")
# Nodes with name='Singapore' that have a 'year' child
root.findall(".//year/..[@name='Singapore']")
# 'year' nodes that are children of nodes with name='Singapore'
root.findall(".//*[@name='Singapore']/year")
# All 'neighbor' nodes that are the second child of their parent
root.findall(".//neighbor[2]")

6、namespace 

6.1 namespace 获取

# namespace 为 正则匹配获取,可能不同版本的会获取不到
root = tree.getroot()
namespace = re.search('\{.*?\}', root.tag)[0]

6.2 xml.etree.Element 在处理含有namespace的xml文件时写入会产生ns0

root = tree.getroot()
namespace = re.search('\{.*?\}', root.tag)[0]
ET.register_namespace('', namespace.strip('{}'))  # 部分人说这步需要在parse之前做,在我的版本上不需要

7、其他错误

7.1 Error parsing XML: junk after document element

一般合法的XML文件只有一个主根节点,比如

<android123><item1/><item2/><item3/>
</android123>

如果出现了Error parsing XML: junk after document element这样的错误,你的想法可能只要主根有多个节点,比如说

<android123><item1/>
</android123>
<android123><item2/><item3/>
</android123>

xml不能解析,原因有可能为xml格式写的不对,考虑根节点不对。

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

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

相关文章

android 编译luajit,Android 嵌入 LuaJIT 的曲折道路

相关链接&#xff1a;Windows 下编译 LuaJIT懒人与伸手党可以直接看最底部。为什么使用 LuaJITLua 官方版的编译嵌入相对简单&#xff0c;但是为什么要用 LuaJIT 呢&#xff1f;我所了解到的优势有&#xff1a;更高的运行效率。支持运行 Lua 编译后的机器码。虽然 Lua 也支持编…

运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(一)

前言 记得刚来这家公司的时候&#xff0c;我部门就我一个运维工程师&#xff0c;然后就是经理&#xff0c;刚开始公司平台什么监控都没有&#xff0c;在我与经理的努力下&#xff0c;先搭建nagioscacti监控平台&#xff0c;后来随着公司业务的增加&#xff0c;平台的功能与服务…

面试风云录(01) - 怎样回答这两个问题?

由于工作经历的缘故&#xff0c;使我有一些面试别人的机会&#xff0c;所以应该还有一些经验可以跟大家聊聊。 当我们提到“面试” 这个词&#xff0c;总是让人有种阶级感&#xff0c;好像面试官就是高高在上&#xff0c;而面试者则是屈居于下&#xff0c;其实并非如此&#xf…

Redis Python

Python操作Redis 安装Python使用Redis的库 sudo pip install redis or sudo easy_install redis or 源码安装 详见&#xff1a;https://github.com/WoLpH/redis-py 1.1 操作模式 redis-py提供两个类Redis和StrictRedis用于实现Redis的命令&#xff0c;StrictRedis用于实现大…

android 代码写命令,monkey基本命令及脚本编写(示例代码)

Monkey 是Android自带的黑盒测试工具&#xff0c;一般通过随机触发界面事件&#xff0c;来确定应用是否会发生异常&#xff0c;多用于android应用的稳定性、压力测试基本命令&#xff1a;adb shell monkey [options] usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] .…

js更新数组对象_7 种Vue 数据已更新而页面没有更新的情况及深化总结(收藏)

作者&#xff1a;前端1943链接&#xff1a;https://segmentfault.com/a/1190000022772025如果你发现你自己需要在 Vue 中做一次强制更新&#xff0c;99.9% 的情况&#xff0c;是你在某个地方做错了事。1. Vue 无法检测实例被创建时不存在于 data 中的 property原因&#xff1a;…

从P560小型机B181201B故障代码识别手把手详解

背景&#xff1a;生产小型机发生宕机事件&#xff0c;现场发现液晶面板存在B181201B代码&#xff0c;可是查看网络&#xff0c;未见有权威的参考文章&#xff0c;通过管理口登录HMC管理界面&#xff0c;发现错误代码B181201B&#xff0c;同时提示可能是电源故障&#xff0c;后登…

Java反射中method.isBridge() 桥接方法

桥接方法是 JDK 1.5 引入泛型后&#xff0c;为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容&#xff0c;由编译器自动生成的方法。我们可以通过Method.isBridge()方法来判断一个方法是否是桥接方法。 假定接口 public interface SuperClass<T> {void met…

python 利用pexpect进行多机远程命令执行

在安装之前&#xff0c;确认你的机器安装了python,和easy_install.通常python是自动安装的&#xff0c;如果没有安装easy_install&#xff0c;那么wget -q http://peak.telecommunity.com/dist/ez_setup.py 获取一下python ez_setup.pypexpect是python一个模块&#xff0c;可以…

Python 之 线程

进程 之前我们已经了解了操作系统中进程的概念&#xff0c;程序并不能单独运行&#xff0c;只有将程序装载到内存中&#xff0c;系统为它分配资源才能运行&#xff0c;而这种执行的程序就称之为进程。程序和进程的区别就在于&#xff1a;程序是指令的集合&#xff0c;它是进程…

flymcu无法打开串口_西门子1200与其他PLC/组态软件无线串口通讯(自由口)

一、控制系统原理图1:控制系统原理二、硬件需求S7-1200 PLC目前有3种类型的CPU&#xff1a;1)S7-1211C CPU2)S7-1212C CPU3)S7-1214C CPU这三种类型的CPU都可以连接三个串口通信模版本例中使用的PLC硬件为&#xff1a;1)PM1207电源(6EP1 332-1SH71)2)S7-1214C(6ES7 214-1BE30-0…

android按钮固定尺寸,如何在android中保持按钮的固定宽高比

我正在改进你的XML.我没有测试它,但它应该工作.建议的更改是,而不是将图像设置为背景,将其设置为ImageButtons的src.此外,如果您坚持使用Button,则可以使用其他布局包装每个按钮,并将其重力属性设置为“center”.看一下下面的XML.android:layout_width"fill_parent"a…

横空出世,席卷互联网--评微软等公司数据结构和算法面试100题

横空出世&#xff0c;席卷互联网 ---评微软数据结构算法面试100题 作者&#xff1a;July。 时间&#xff1a;2010年10月-11月。版权所有&#xff0c;侵权必究。 出处&#xff1a;http://blog.csdn.net/v_JULY_v。 说明&#xff1a;本文原题为&#xff1a;“横空出世&#xff0c…

收银管理系统怎样帮助商家很好地经营服装门店

收银管理系统对于服装门店的经营可以提供多方面的帮助&#xff0c;以下是一些具体的优势和功能&#xff1a; 1. 快速准确的收银&#xff1a;收银管理系统可以实现快速、准确的收银操作&#xff0c;通过条码扫描或手动输入商品信息&#xff0c;自动计算价格并生成收据。这样可以…

BZOJ 1567: [JSOI2008]Blue Mary的战役地图

二次联通门 : BZOJ 1567: [JSOI2008]Blue Mary的战役地图 /*BZOJ 1567: [JSOI2008]Blue Mary的战役地图社会我栋哥人怂P话多暴力能A题正解能WA0*/ #include <cstdio> #include <iostream>#define rg register inline void read (int &n) {rg char c getchar (…

python模拟输入回车键_用Python模拟键盘输入

import win32apiimport win32conwin32api.keybd_event(17,0,0,0) #ctrl键位码是17win32api.keybd_event(86,0,0,0) #v键位码是86win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)附个键位码表&#xff…

Python 之 进程

目录 理论知识 操作系统背景知识 进程 什么是进程 进程调度 进程的并行与并发 同步异步阻塞非阻塞 同步和异步 阻塞与非阻塞 同步/异步与阻塞/非阻塞 组合 进程的创建与结束 进程的创建 进程的结束 在python程序中的进程操作 multiprocess&#xff08;multiproc…

从全息投影到全息平台,必须克服7个障碍

“每个科幻爱好者和痴迷技术的人儿都希望能拥有一个全息成像台。不幸的是&#xff0c;制造全息平台的技术还尚未被人类掌握。据说我们离这项技术可用之时还有大约10到15年的时间——这是 AMD 的专业人士 Phil Rogers 说的&#xff0c;他专攻 3D 技术工作已超过20年。在《今日宇…

android fragment fragmenttransaction,Android FragmentTransaction 常用方法总结

FragmentManage&#xff1a;FragmentManager能够实现管理activity中fragment. 通过调用activity的getFragmentManager()取得它的实例.FragmentManager可以做如下一些事情:1、使用findFragmentById() (用于在activity ...public class Toolkit { /** * * Role:Telec…

IBM总架构师寇卫东:话说程序员的职业生涯-IT程序人生-职业生涯规划

初级程序员和高级程序员时期&#xff0c;都属于职业生涯发展的第一阶段&#xff0c;我们可以称之为黄金时期。这阶段程序员的年龄在20~35岁之间&#xff0c;因为年轻&#xff0c;所以更善于学习&#xff0c;而且体力充沛&#xff0c;很多走过这个阶段的程序员有过通宵工作的经历…