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解析方法相关推荐

  1. Python XML解析器– ElementTree

    Python XML parser provides us an easy way to read the XML file and extract useful data. Today we wil ...

  2. 简述C# XML解析方法的特点及应用

    C# XML解析方法都有哪些呢?在程序中访问并操作XML文件一般有两种模型:流模型和DOM(文档对象模型).流模型中有两种变体--"推"模型和"拉"模型. C# ...

  3. Python XML解析

    什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是一套定义语义标记的规则,这 ...

  4. python菜鸟驿站-Python XML 解析

    1.对大型文件进行处理: 2.只需要文件的部分内容,或者只需从文件中得到特定信息. 3.想建立自己的对象模型的时候. 在python中使用sax方式处理xml要先引入xml.sax中的parse函数, ...

  5. JAVA常用的XML解析方法

    转并总结自(java xml) JAVA常用的解析xml的方法有四种,分别是DOM,JAX,JDOM,DOM4j xml文件 <?xml version="1.0" enco ...

  6. 【零基础上手JavaWeb】07 快速上手 XML解析方法

    写在前面,大家好!我是[跨考菌],一枚跨界的程序猿,专注于后台技术的输出,目标成为全栈攻城狮!这博客是对我跨界过程的总结和思考.如果你也对Java.后端技术感兴趣,抑或是正在纠结于跨界,都可以关注我的 ...

  7. python xml解析dom_如何解析python中表示xml.dom.minidom节点的字符串?

    我有一个使用xml.dom.minidom创建的nodes xml.dom.Node对象的集合.通过使用Node对象的toxml()方法将它们转换为字符串,我将它们(单独)存储在数据库中. 问题是,有 ...

  8. Python XML 解析

    1:解析xml---文件 from xml.dom.minidom import parse import xml.dom.minidom# 使用minidom解析器打开XML文档 DOMTree = ...

  9. python json解析方法_Python 中的 JSON 方式讲解

    Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化,代码如下:import json class Stude ...

最新文章

  1. 中国商业航天单轮最大融资!星际荣耀B轮获投11.925亿
  2. Python字典推导式将cookie字符串转化为字典
  3. 我是如何解决gitlab 命令行上传需要输密码
  4. laravel-admin 开发 bootstrap-treeview 扩展包
  5. 「常微分方程」(阿諾爾德) Page 6 問題4 經過擴張相空間的每一點有且僅有一條積分曲線...
  6. Java案例:词频统计
  7. gnuplot 使用时遇到的问题
  8. NSRunLoop NSTimer
  9. ArcView,ArcGis,MapObjects,ISRI有什么区别
  10. 模板引擎jade/ejs,模板适配
  11. 计算机图形学与地理信息科学,南京师范大学
  12. L4RE学习笔记——服务介绍
  13. GStreamer和gst-omx插件
  14. MySQL从删库到跑路(1):神秘大爷
  15. Ask and Answer
  16. 入驻三年,Airbnb在中国做了什么?
  17. 帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析
  18. js 点击按钮或者图片,实现图片上传并显示在页面上
  19. bat命令实现游戏存档自动备份
  20. 常用又有趣的网站大合集

热门文章

  1. 腾讯云从业者认证考试内容 分享腾讯云架构tca考试题
  2. Sci-Hub 可用网址
  3. 【通信】非正交多址接入(NOMA)和正交频分多址接入(OFDMA)的性能对比附matlab代码
  4. 支付宝接口申请流程-傲付宝
  5. 2017香港礼品及赠品展会刊(参展商名录)
  6. 阿里云本机一键登录集成
  7. 神州数码易拓TIOTOP ERP查询作业模板-上单头下单身查询作业
  8. 老闪创业那些事儿(39)——有梦想的春雷
  9. Oracle 11g RAC+DG项目实战(共15集)视频
  10. 数据分析~案例:中国五大城市PM2.5数据分析