zoukankan      html  css  js  c++  java
  • python使用sax实现xml解析

    之前在使用xml解析的时候,在网上搜了很多教程,最终没有能按照网上的教程实现需求。

    所以呢,只好自己去看源码,在sax的__init__.py下看到这么一段代码:

    1 def parse(source, handler, errorHandler=ErrorHandler()):
    2     parser = make_parser()
    3     parser.setContentHandler(handler)
    4     parser.setErrorHandler(errorHandler)
    5     parser.parse(source)
    # 可以看出来,执行xml解析至少需要两个参数:source:源文件路径和实例化的handler对象

    下面我们就用一个例子来是实现一下:(事先说明,这个例子是网上找的,不是自己写的)

    <bookstore>
        <book category="CHILDREN">
            <title>Harry Potter</title>
            <author>J K. Rowling</author>
            <year>2005</year>
            <price>29.99</price>
        </book>
        <book category="WEB">
            <title>Learning XML</title>
            <author>Erik T. Ray</author>
            <year>2003</year>
            <price>39.95</price>
        </book>
    </bookstore>

    下面将对各个步骤的作用逐个说明:

    #!usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2018/5/30 22:43
    # @Author  : Adong_Chen
    
    from xml import sax
    
    
    class TestHandler(sax.ContentHandler):                # 定义自己的handler类,继承sax.ContentHandler
    	def __init__(self):
    		sax.ContentHandler.__init__(self)     # 弗父类和子类都需要初始化(做一些变量的赋值操作等)
    		self._content = ""
    		self._tag = ""
    
    	def startElement(self, name, attrs):           # 遇到<tag>标签时候会执行的方法,这里的name,attrs不用自己传值的(这里其实是重写)
    		self._tag = name
    		if name == "bookstore":
    			print "=========BOOKSTORE========="
    		if self._tag == "book":
    			print "BOOK: " + attrs["category"]
    			print "--------------------------"
    
    	def endElement(self, name):              # 遇到</tag>执行的方法,name不用自己传值(重写)
    		# print "endElement"
    		if name == "bookstore":
    			print "=========BOOKSTORE========="
    		elif name == "title":
    			print "Title: " + self._content
    		elif name == "author":
    			print "Author: " + self._content
    		elif name == "year":
    			print "Year: " + self._content
    		elif name == "price":
    			print "Price: " + self._content
    		else:
    			pass
    
    	def characters(self, content):                      # 获取标签内容
    		self._content = content
    
    
    if __name__ == "__main__":
    	handler = TestHandler()         # 自定义类实例化成对象
    	sax.parse("Test2.xml", handler)  # 解析xml文件
    

      

    执行结果如下:

    =========BOOKSTORE=========
    BOOK: CHILDREN
    --------------------------
    Title: Harry Potter
    Author: J K. Rowling
    Year: 2005
    Price: 29.99
    BOOK: WEB
    --------------------------
    Title: Learning XML
    Author: Erik T. Ray
    Year: 2003
    Price: 39.95
    =========BOOKSTORE=========
  • 相关阅读:
    php 7.1 openssl_decrypt() 代替 mcrypt_module_open() 方法
    关于Http_build_query的用法
    git fetch 和git pull 的差别
    PhpStorm 头部注释、类注释和函数注释的设置
    输出信息log4j.properties的作用与使用方法
    字段设置ALV中下拉列表列的实现
    遍历中序C语言实现二叉树的递归遍历与非递归遍历
    搜索中文Solr Analysis And Solr Query Solr分析以及查询
    记忆指向指针常量 常量指针 常量指针常量
    匹配位置KMP算法深入浅出
  • 原文地址:https://www.cnblogs.com/chenadong/p/9117156.html
Copyright © 2011-2022 走看看