A-A+
python 处理xml (或xml文件)
在这里我要先吐槽一下,真的,网上太多太多的傻缺, 真的服了,说python3.4+ 用xml.etree.ElementTree 说用这个方法处理的人十有八九都TM是脑残吧?!!!
不信的自己去搜搜,好多好多文章 python 3.3+ 说用这个方法。。。真的是。。。。。。。。
------------正文--------------
下面说说 python 2 3+ 应该用什么处理xml
xml.sax Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。
一文便懂如何使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | # !/usr/bin/env python # -*- coding: utf-8 -*- """ ------------------------------------------------- @ Author : Max_Pengjb @ date : 2018/9/23 22:37 @ IDE : PyCharm @ GitHub : https://github.com/JackyPJB @ Contact : pengjianbiao@hotmail.com ------------------------------------------------- Description : ------------------------------------------------- """ import xml.sax __author__ = 'Max_Pengjb' """ SAX库 SAX是一种基于事件驱动的API,使用SAX解析XML时主要分两个部分:解析器和事件处理器。 解析器 解析器负责读取XML文档,并向事件处理器发送事件,比如元素开始跟元素结束事件。 SAX提供了两个函数:parse和parseString。前者用于从文件中解析XML数据,后者用于从字符串中解析XML数据。 两个函数的声明如下: xml.sax.parse( xmlfile, contenthandler) xml.sax.parseString(xmlstring, contenthandler) parse函数的第一个参数是XML文件的路径,比如: xml.sax.parse("test.xml",contenthandler) parseString函数的第一个参数是含有XML数据的字符串,比如: data = "<data>Hello</data>" xml.sax.parseString(data,contenthandler) 而它们的第二个参数则是接下来要介绍的事件处理器。 事件处理器 事件处理器则负责对事件作出响应,对传递的XML数据进行处理。 一个事件处理器必须是ContentHandler类型的子类,通过重写父类的以下函数来响应解析器的事件请求: characters(content)函数,它会在以下时机被调用: 如果从一行开始,遇到标签之前,存在字符,则content的值为这些字符串。 如果从一个标签,遇到下一个标签之前,存在字符,则content的值为这些字符串。 如果从一个标签,遇到行结束符(换行符)之前,存在字符,则content的值为这些字符串。 标签可以是开始标签,也可以是结束标签。 startDocument()函数,它在文档启动的时候调用。 endDocument()函数,它在解析器到达文档结尾时调用。 startElement(name, attrs)函数,它在遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。 endElement(name)函数,它在遇到XML结束标签时调用。 假设有如下文件test.xml: <data>文字1 文字2<ele1>元素1数据</ele1>文字3 文字4<ele2>元素2数据</ele2>文字5 </data> 当运行以下代码时: import xml.sax class Handler(xml.sax.ContentHandler): def startDocument(self): print("文档开始") def endDocument(self): print("文档结束") def startElement(self,name,attrs): print("开始标签:" , name) def endElement(self,name): print("结束标签:" , name) def characters(self,content): print("数据:" ,content) if __name__ == '__main__': xml.sax.parse("test.xml",Handler()) 会得到以下结果: 文档开始 开始标签: data 数据: 文字1 数据:<换行> 数据: 文字2 开始标签: ele1 数据: 元素1数据 结束标签: ele1 数据: 文字3 数据:<换行> 数据: 文字4 开始标签: ele2 数据: 元素2数据 结束标签: ele2 数据: 文字5 数据:<换行> 结束标签: data 文档结束 注意:结果中的<换行>其实是换行字符\n,为了方便阅读才改成<换行>。 将其与test.xml中数据的结构对比一下,就可以明白每个函数调用的时机了。 """ class Handler(xml.sax.ContentHandler): def startDocument(self): print("文档开始") def endDocument(self): print("文档结束") def startElement(self, name, attrs): print("开始标签:", name) def endElement(self, name): print("结束标签:", name) def characters(self, content): print("数据:", content) test_xml = ''' <data>文字1 文字2<ele1>元素1数据</ele1>文字3 文字4<ele2>元素2数据</ele2>文字5 </data>''' xml.sax.parseString(test_xml, Handler()) |
文章来源:https://github.com/JackyPJB/python-learning/blob/2f1634cebe4f0c4122436370b727ebc7a2660fa6/json_xml/xml_one.py
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏