Python XML解析方法
XML介绍
XML(eXtensible Markup Language,可扩展标记语言):一种用于标记电子文件使其具有结构性的标记语言,被用来传输和存储数据
XML文档结构:一种树结构,从根部开始,扩展到枝叶
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
(1)根元素:XML 文档必须包含根元素,该元素是所有其他元素的父元素
(2)子元素:父元素拥有子元素,相同层级上的子元素成为同胞(兄弟或姐妹)
(3)类似HTML,所有的元素都可以有文本内容和属性
实例:在下图,根元素是bookstore,文档中所有的book元素都被包含在bookstore中,book元素有4个子元素:title, author, year, price
<bookstore><book category="COOKING"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="CHILDREN"><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><book category="WEB"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book>
</bookstore>
XML解析
Python有三种方法解析XML:SAX, DOM, ElementTree
方法1:SAX (Simple API for XML)
完整的SAX API文档:https://docs.python.org/3/library/xml.sax.html
SAX用事件驱动模型,通过解析XML的过程中触发一个个的事件,并调用用户定义的回调函数来处理XML文件。
(1)解析器:负责读取XML文档,并向事件处理器发送事件,如元素开始、元素结束事件
(2)事件处理器:负责对事件作出响应,对传递的XML数据进行处理。
通常应用于:①对大型文件进行处理;②只需要文件的部分内容,或者只需从文件中得到特定信息;③想建立自己的对象模型
在Python中使用SAX方式处理XML要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler
make_parse方法
- 创建一个新的解析器对象并返回:
xml.sax.make_parser([parser_list])
参数1 parser_list,可选参数,解析器列表
parse方法
- 创建一个SAX解析器并解析XML文档:
xml.sax.parse(xmlfile, contenthandler[, errorhandler])
参数1 xmlfile,xml文件名
参数2 contenthandler,必须是一个ContentHandler对象
参数3 errorhandler,如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
parseString方法
- 创建一个XML解析器并解析xml字符串:
xml.sax.parseString(xmlstring, contenthandler[,errorhandler])
参数1 xmlstring,xml字符串
参数2 contenthandler,必须是一个ContentHandler对象
参数3 errorhandler,如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
ContentHandler类方法
characters(content)方法:调用时机:从行开始,遇到标签之前,存在字符,content的值为这些字符串。从一个标签,遇到下一个标签之前,存在字符,content的值为这些字符串;从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。标签可以是开始标签,也可以是结束标签。
startDocument()方法:文档启动的时候调用
endDocument()方法:解析器到达文档结尾时调用
startElement(name, attrs)方法:遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典
endElement(name)方法:遇到XML结束标签时调用
Python使用SAX解析XML实例:
movies.xml
<collection shelf="New Arrivals">
<movie title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers"><type>Anime, Science Fiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>A schientific fiction</description>
</movie>
<movie title="Trigun"><type>Anime, Action</type><format>DVD</format><episodes>4</episodes><rating>PG</rating><stars>10</stars><description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar"><type>Comedy</type><format>VHS</format><rating>PG</rating><stars>2</stars><description>Viewable boredom</description>
</movie>
</collection>
import xml.saxclass MovieHandler(xml.sax.ContentHandler):def __init__(self):self.CurrentData = ""self.type = ""self.format = ""self.year = ""self.rating = ""self.stars = ""self.description = ""# 元素开始调用def startElement(self, tag, attributes):self.CurrentData = tagif tag == "movie":print ("*****Movie*****")title = attributes["title"]print ("Title:", title)# 元素结束调用def endElement(self, tag):if self.CurrentData == "type":print ("Type:", self.type)elif self.CurrentData == "format":print ("Format:", self.format)elif self.CurrentData == "year":print ("Year:", self.year)elif self.CurrentData == "rating":print ("Rating:", self.rating)elif self.CurrentData == "stars":print ("Stars:", self.stars)elif self.CurrentData == "description":print ("Description:", self.description)self.CurrentData = ""# 读取字符时调用def characters(self, content):if self.CurrentData == "type":self.type = contentelif self.CurrentData == "format":self.format = contentelif self.CurrentData == "year":self.year = contentelif self.CurrentData == "rating":self.rating = contentelif self.CurrentData == "stars":self.stars = contentelif self.CurrentData == "description":self.description = contentif ( __name__ == "__main__"):# 创建一个 XMLReaderparser = xml.sax.make_parser()# 关闭命名空间parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重写 ContextHandlerHandler = MovieHandler()parser.setContentHandler( Handler )parser.parse("movies.xml")
程序执行结果:
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
方法2:DOM (Document Object Model)
完整的DOM API文档:https://docs.python.org/3/library/xml.dom.html
DOM将XML数据在内存中解析成一个树,通过对树的操作来操作XML
利用DOM提供的不同函数读取或修改文档的内容和结构,也可以把修改的内容写入XML文件
Python使用xml.dom.minidom解析XML实例:
from xml.dom.minidom import parse
import xml.dom.minidom# 使用minidom解析器打开XML文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collections.hasAttribute("shelf"):print("Root element: %s" % collection.getAttribute("shelf"))# 在集合中获取所有电影
movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息
for movie in movies:print ("*****Movie*****")if movie.hasAttribute("title"):print ("Title: %s" % movie.getAttribute("title"))type = movie.getElementsByTagName('type')[0]print ("Type: %s" % type.childNodes[0].data)format = movie.getElementsByTagName('format')[0]print ("Format: %s" % format.childNodes[0].data)rating = movie.getElementsByTagName('rating')[0]print ("Rating: %s" % rating.childNodes[0].data)description = movie.getElementsByTagName('description')[0]print ("Description: %s" % description.childNodes[0].data)
程序执行结果:
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
方法3:ElementTree
完整的ElementTree API文档:https://docs.python.org/3.6/library/xml.etree.elementtree.html
此部分详见:https://blog.csdn.net/weixin_36279318/article/details/79176475
xml.etree.ElementTree模块实现了一个简单而高效的API用于解析和创建XML数据,比DOM更加轻量化
- 读取xml文件,导入数据
import xml.etree.ElementTree as ET
tree = ET.parse('movies.xml')
root = tree.getroot()
- 作为一个元素,root有一个标签和一个属性字典,它也有子节点,可以迭代
>>> root.tag
'collection'
>>> root.attrib
{'shelf': 'New Arrivals'}>>> for child in root:
... print(child.tag, child.attrib)
movie {'title': 'Enemy Behind'}
movie {'title': 'Transformers'}
movie {'title': 'Trigun'}
movie {'title': 'Ishtar'}
- 孩子节点是嵌套的,可以通过索引访问特定的子节点
>>> root[0][1].text
'DVD'
- 获取XML中的元素的方法
Element.iter()
:递归地遍历它下面的所有子树
>>> for movie in root.iter('movie'):
... print(movie.attrib)
{'title': 'Enemy Behind'}
{'title': 'Transformers'}
{'title': 'Trigun'}
{'title': 'Ishtar'}
Element.findall()
:只找到带有标签的元素,该标签是当前元素的直接子元素
Element.find()
:找到第一个带有特定标签的子元素
Element.text
:访问标签的内容
Element.get()
:访问标签的属性值
>>> for movie in root.findall('movie'):
... type = movie.find('type').text
... name = movie.get('type')
... print(name, type)None War, Thriller
None Anime, Science Fiction
None Anime, Action
None Comedy
- 修改XML文件,ElementTree提供了一种构建xml文档并将xml写入文件的简单方法
ElementTree.write()
:创建xml或向xml写入数据
Element.set()
:添加和修改标签的属性和属性值
Element.append()
:添加孩子节点
Element.remove()
:删除满足条件的标签
- 创建XML文档:
SubElement()
:创建新的子元素
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>
- 写入XML头部信息
参考:https://blog.csdn.net/zichehantz/article/details/110705620
tree.write('test.xml',encoding='utf-8',xml_declaration=True) #设置xml_declaration为True即自动添加xml头部信息 <?xml version='1.0' encoding='utf-8'?>
- 对XML修饰,tag增加换行和缩进
参考:https://blog.csdn.net/u012692537/article/details/101395192
https://blog.csdn.net/m0_37735141/article/details/108750140
def indent(elem, level = 0):i = "\n" + level*"\t"if len(elem):if not elem.text or not elem.text.strip():elem.text = i + "\t"if not elem.tail or not elem.tail.strip():elem.tail = ifor elem in elem:indent(elem, level+1)if not elem.tail or not elem.tail.strip():elem.tail = ielse:if level and (not elem.tail or not elem.tail.strip()):elem.tail = i
Python XML解析方法相关推荐
- Python XML解析器– ElementTree
Python XML parser provides us an easy way to read the XML file and extract useful data. Today we wil ...
- 简述C# XML解析方法的特点及应用
C# XML解析方法都有哪些呢?在程序中访问并操作XML文件一般有两种模型:流模型和DOM(文档对象模型).流模型中有两种变体--"推"模型和"拉"模型. C# ...
- Python XML解析
什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是一套定义语义标记的规则,这 ...
- python菜鸟驿站-Python XML 解析
1.对大型文件进行处理: 2.只需要文件的部分内容,或者只需从文件中得到特定信息. 3.想建立自己的对象模型的时候. 在python中使用sax方式处理xml要先引入xml.sax中的parse函数, ...
- JAVA常用的XML解析方法
转并总结自(java xml) JAVA常用的解析xml的方法有四种,分别是DOM,JAX,JDOM,DOM4j xml文件 <?xml version="1.0" enco ...
- 【零基础上手JavaWeb】07 快速上手 XML解析方法
写在前面,大家好!我是[跨考菌],一枚跨界的程序猿,专注于后台技术的输出,目标成为全栈攻城狮!这博客是对我跨界过程的总结和思考.如果你也对Java.后端技术感兴趣,抑或是正在纠结于跨界,都可以关注我的 ...
- python xml解析dom_如何解析python中表示xml.dom.minidom节点的字符串?
我有一个使用xml.dom.minidom创建的nodes xml.dom.Node对象的集合.通过使用Node对象的toxml()方法将它们转换为字符串,我将它们(单独)存储在数据库中. 问题是,有 ...
- Python XML 解析
1:解析xml---文件 from xml.dom.minidom import parse import xml.dom.minidom# 使用minidom解析器打开XML文档 DOMTree = ...
- python json解析方法_Python 中的 JSON 方式讲解
Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化,代码如下:import json class Stude ...
最新文章
- 中国商业航天单轮最大融资!星际荣耀B轮获投11.925亿
- Python字典推导式将cookie字符串转化为字典
- 我是如何解决gitlab 命令行上传需要输密码
- laravel-admin 开发 bootstrap-treeview 扩展包
- 「常微分方程」(阿諾爾德) Page 6 問題4 經過擴張相空間的每一點有且僅有一條積分曲線...
- Java案例:词频统计
- gnuplot 使用时遇到的问题
- NSRunLoop NSTimer
- ArcView,ArcGis,MapObjects,ISRI有什么区别
- 模板引擎jade/ejs,模板适配
- 计算机图形学与地理信息科学,南京师范大学
- L4RE学习笔记——服务介绍
- GStreamer和gst-omx插件
- MySQL从删库到跑路(1):神秘大爷
- Ask and Answer
- 入驻三年,Airbnb在中国做了什么?
- 帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析
- js 点击按钮或者图片,实现图片上传并显示在页面上
- bat命令实现游戏存档自动备份
- 常用又有趣的网站大合集