热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python全栈之路标准库系列之xml模块

Python’sinterfacesforprocessingXMLaregroupedinthexmlpackage.带分隔符的文件仅有两维的数据:行和列。如果你想

Python’s interfaces for processing XML are grouped in the xml package.


带分隔符的文件仅有两维的数据:行和列。如果你想在程序之间交换数据结构,需要一种方法把层次结构、序列、集合和其他的结构编码成文本。

XML是最突出的处理这种转换的标记(markup)格式,它使用标签(tag)分个数据,如下面的实例文件menu.xml所示:

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容

大好时光!2016-05-24T15:29:19.000Zhttps://blog.ansheng.me/安生


XML的一些重要特性


  1. 标签以一个<字符开头&#xff0c;例如实例中的feed、title、subtitle、author。
  2. 忽略空格
  3. 通常一个开始标签跟一段其他的内容&#xff0c;然后是最后相匹配的结束标签&#xff0c;例如大好时光&#xff01;
  4. 标签之间是可以存在多级嵌套的
  5. 可选属性(attribute)可以出现在开始标签里
  6. 标签中可以包含值(value)
  7. 如果一个命名为thing的标签内没有内容或者子标签&#xff0c;那么它可以用在右尖括号的前面添加斜杠的简单标签所表示&#xff0c;例如代替开始和结束都存在的标签。
  8. 存放数据的位置可以是任意的—属性、值或者子标签。

XML通常用于数据传送和消息&#xff0c;它存在一些子格式&#xff0c;如RSS和Atom&#xff0c;例如&#xff1a;https://blog.ansheng.me/atom.xml

在Python中解析XML最简单的方法是使用ElementTree


模块说明
xml.etree.ElementTreethe ElementTree API, a simple and lightweight XML processor

创建xml文件

导入ElementTree方法&#xff0c;起一个别名为ET

>>> from xml.etree import ElementTree as ET

创建顶级标签

>>> level_1 &#61; ET.Element("famliy")

创建二级标签&#xff0c;tag名name&#xff0c;attrib标签属性

>>> level_2 &#61; ET.SubElement(level_1, "name", attrib&#61;{"enrolled":"yes"})

创建三级标签

>>> level_3 &#61; ET.SubElement(level_2, "age", attrib&#61;{"checked":"no"})

生成文档

>>> tree &#61; ET.ElementTree(level_1)

写入文件中

>>> tree.write(&#39;oooo.xml&#39;,encoding&#61;&#39;utf-8&#39;, short_empty_elements&#61;False)

导入os模块&#xff0c;用os模块中的system方法执行shell命令查看刚才创建的oooo.xml文件

>>> import os
>>> os.system("cat oooo.xml")
# 生成出来的文档是没有换行的
0

把刚才生成的文件下载到本地&#xff0c;然后用浏览器打开就可以看到分级层次了。


创建一个有换行的XML文件

代码

from xml.etree import ElementTree as ET
from xml.dom import minidomroot &#61; ET.Element(&#39;level1&#39;,{"age":"1"})
son &#61; ET.SubElement(root,"level2",{"age":"2"})
ET.SubElement(son, "level3", {"age":"3"})# tree &#61; ET.ElementTree(root)
# tree.write("abc.xml", encoding&#61;"utf-8",xml_declaration&#61;True,short_empty_elements&#61;False)def prettify(root):rough_string &#61; ET.tostring(root, &#39;utf-8&#39;)reparsed &#61; minidom.parseString(rough_string)return reparsed.toprettyxml(indent&#61;"\t")new_str &#61; prettify(root)
f &#61; open("new_out.xml", "w")
f.write(new_str)
f.close()

生成的xml文件





解析XML

first.xml文件内容为&#xff1a;

22025141100520285990069202813600

first.xml文件在/root目录下

利用ElementTree.XML将字符串解析成xml对象

>>> from xml.etree import ElementTree as ET
# 打开文件&#xff0c;读取XML内容&#xff0c;将字符串解析成xml特殊对象&#xff0c;root代指xml文件的根节点
>>> root &#61; ET.XML(open(&#39;first.xml&#39;, &#39;r&#39;).read())
>>> root.tag
&#39;data&#39;
>>> for node in root:
... print(node.tag, node.attrib)
...
(&#39;country&#39;, {&#39;name&#39;: &#39;Liechtenstein&#39;})
(&#39;country&#39;, {&#39;name&#39;: &#39;Singapore&#39;})
(&#39;country&#39;, {&#39;name&#39;: &#39;Panama&#39;})
>>> print(node.find(&#39;rank&#39;).text)
69

利用ElementTree.parse将文件直接解析成xml对象

>>> from xml.etree import ElementTree as ET
# 直接解析xml文件
>>> tree &#61; ET.parse("first.xml")
# 获取xml文件的根节点
>>> root &#61; tree.getroot()
>>> root.tag
&#39;data&#39;

遍历XML中指定的节点

>>> from xml.etree import ElementTree as ET
>>> tree &#61; ET.parse("first.xml")
>>> root &#61; tree.getroot()
>>> for node in root.iter(&#39;year&#39;):# 输出node的tag和内容
... print(node.tag, node.text)
...
year 2025
year 2028
year 2028

增、删、改XML

为节点添加属性

>>> from xml.etree import ElementTree as ET
>>> tree &#61; ET.parse("first.xml")
>>> root &#61; tree.getroot()
>>> for node in root.iter("year"):# 查看原来的属性
... print(node.attrib)
...
{}
{}
{}
>>> for node in root.iter("year"):# 添加属性
... node.set("OS","Linux")
...
>>> for node in root.iter("year"):# 查看添加的属性
... print(node.attrib)
...
{&#39;OS&#39;: &#39;Linux&#39;}
{&#39;OS&#39;: &#39;Linux&#39;}
{&#39;OS&#39;: &#39;Linux&#39;}
# 把内容写入文件
>>> tree.write("first.xml")

删除节点属性

>>> from xml.etree import ElementTree as ET
>>> tree &#61; ET.parse("first.xml")
>>> root &#61; tree.getroot()
>>> for node in root.iter("year"):# 删除节点的OS属性
... del node.attrib[&#39;OS&#39;]
...
# 写入到文件当中
>>> tree.write("first.xml")

查看属性

>>> from xml.etree import ElementTree as ET
>>> tree &#61; ET.parse("first.xml")
>>> root &#61; tree.getroot()
>>> for node in root.iter("year"):
... print(node.attrib)
...
# 节点内容为空
{}
{}
{}

修改节点内容

修改year内的数字自加1

>>> from xml.etree import ElementTree as ET
>>> tree &#61; ET.parse("first.xml")
>>> root &#61; tree.getroot()
>>> for node in root.iter("year"):# 输出原来year的内容
... print(node.text)# 原来的值自加&#43;
... new_year &#61; int(node.text) &#43; 1
... node.text &#61; str(new_year)
...
2025
2028
2028
# 写入文件中
>>> tree.write("first.xml")
>>> for node in root.iter("year"):# 输出写入文件之后year的内容
... print(node.text)
...
2026
2029
2029

对节点操作的方法

获取节点的方法

>>> from xml.etree import ElementTree as ET
>>> tree &#61; ET.parse("first.xml")
>>> root &#61; tree.getroot()
>>> print(dir(root))
[&#39;__class__&#39;, &#39;__copy__&#39;, &#39;__deepcopy__&#39;, &#39;__delattr__&#39;, &#39;__delitem__&#39;, &#39;__dir__&#39;, &#39;__doc__&#39;, &#39;__eq__&#39;, &#39;__format__&#39;, &#39;__ge__&#39;, &#39;__getattribute__&#39;, &#39;__getitem__&#39;, &#39;__getstate__&#39;, &#39;__gt__&#39;, &#39;__hash__&#39;, &#39;__init__&#39;, &#39;__le__&#39;, &#39;__len__&#39;, &#39;__lt__&#39;, &#39;__ne__&#39;, &#39;__new__&#39;, &#39;__reduce__&#39;, &#39;__reduce_ex__&#39;, &#39;__repr__&#39;, &#39;__setattr__&#39;, &#39;__setitem__&#39;, &#39;__setstate__&#39;, &#39;__sizeof__&#39;, &#39;__str__&#39;, &#39;__subclasshook__&#39;, &#39;append&#39;, &#39;clear&#39;, &#39;extend&#39;, &#39;find&#39;, &#39;findall&#39;, &#39;findtext&#39;, &#39;get&#39;, &#39;getchildren&#39;, &#39;getiterator&#39;, &#39;insert&#39;, &#39;items&#39;, &#39;iter&#39;, &#39;iterfind&#39;, &#39;itertext&#39;, &#39;keys&#39;, &#39;makeelement&#39;, &#39;remove&#39;, &#39;set&#39;]

方法有这么多&#xff0c;那么我们常用的也就是下面的几个


方法名说明
tag获取tag标签名
attrib获取节点的属性
find获取节点的内容
iter进行迭代
set设置属性
get获取属性

实例

判断QQ是否在线

腾讯提供了能够查看QQ号码是否在线的API&#xff0c;Y&#61;在线&#xff1b;N&#61;离线&#xff1b;E&#61;QQ号码错误&#xff1b;A&#61;商业用户验证失败&#xff1b;V&#61;免费用户超过数量

>>> import requests
>>> from xml.etree import ElementTree as ET
>>> r &#61; requests.get("http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode&#61;6087414")
>>> result &#61; r.text
>>> from xml.etree import ElementTree as ET
>>> node &#61; ET.XML(result)
>>> if node.text &#61;&#61; "Y":
... print("在线")
... else:
... print("离线")
...
在线

获取列车起止时间

代码

r &#61; requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode&#61;K234&UserID&#61;")
result &#61; r.text
root &#61; ET.XML(result)
for node in root.iter(&#39;TrainDetailInfo&#39;):print(node.find(&#39;TrainStation&#39;).text,node.find(&#39;ArriveTime&#39;).text,node.find("StartTime").text)

如果你依然在编程的世界里迷茫&#xff0c;可以加入我们的Python学习扣qun&#xff1a;784758214&#xff0c;看看前辈们是如何学习的&#xff01;交流经验&#xff01;自己是一名高级python开发工程师&#xff0c;从基础的python脚本到web开发、爬虫、django、数据挖掘等&#xff0c;零基础到项目实战的资料都有整理。送给每一位python的小伙伴&#xff01;分享一些学习的方法和需要注意的小细节&#xff0c;点击加入我们的 python学习者聚集地

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week5/Day01/xml_mod.py
上海&#xff08;车次&#xff1a;K234\K235&#xff09; None 11:12:00
# 地点 停止 启动
昆山 11:45:00 11:48:00
苏州 12:12:00 12:16:00
无锡 12:44:00 12:55:00
常州 13:22:00 13:26:00
镇江 14:13:00 14:16:00
南京 15:04:00 15:16:00
蚌埠 17:27:00 17:50:00
徐州 19:38:00 19:58:00
商丘 22:12:00 22:17:00
开封 23:49:00 23:53:00
郑州 00:37:00 01:14:00
新乡 02:20:00 02:22:00
鹤壁 03:01:00 03:03:00
安阳 03:33:00 03:36:00
邯郸 04:11:00 04:16:00
邢台 04:47:00 04:51:00
石家庄 06:05:00 NoneProcess finished with exit code 0

推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
author-avatar
YY666JAME_381
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有