Python解析xml数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhe_ge_sha_shou/article/details/84963900

xml

xml(Extensible Markup Language,可扩展标记语言),它是一种标记语言,定义了一组规则。
xml没有什么特别的,仅仅是纯文本内容,只是和json定义的规则不一样而已。

xml数据结构

<data info="student">
	<name>小明</name>
	<age>18</age>
	<gender>男</gender>
</data>

上述就是一个简单的xml数据,这里有几个概念,包括:

  • 根元素 <data>
  • 子元素 <name><age>…
  • 标签 带<>都是标签<data>是开始标签,</data>是结束标签
  • 属性 开始标签中有其它信息的是属性如data标签中的info
  • 文本 被开始标签和结束标签包含的是文本,如小明

这里就简单的复习了下xml数据。下面使用Python来解析xml数据。

python中的xml模块

python自带xml模块方便开发者解析xml数据。xml模块中包含了广泛使用的API接口--------SAX和DOM。

  • SAX(Simple API for XML)解析xml数据
    xml简单处理API,通过解析XML的过程来触发事件来处理XML文件。不会将整个文件读取到内存中,只读取需要部分的内容。

    xml.sax下提供的函数:

函数名 功能
make_parser(parser_list=[]) 创建并返回SAX解析器
parse(filename_or_strease,handler,error_handler=handler.ErrorHandler()) 解析xml文件,filename_or_stream为指定解析的文件或流,handler为处理XML的回调,通过setContentHandler设置,error_handler为错误回调处理
parseString(string,handler,error_handler=handler.ErrorHandler() 与parse一样,只是从string中解析xml
SAXException(msg,exception=None) XML操作相关的错误或警告

ContentHandler主要事件回调:

方法名 说明
startDocument() 文档解析开始调用一次
endDocument() 解析到文档结尾调用一次
startElement(name,attrs) 文件模式下,遇到开始标签调用该方法,name是标签名,attrs是属性值字典
endElement(name) 文件模式下,遇到结束标签调用该方法,name是标签名
characters(content) 核心方法,1.从行开始,遇到标签之前存在字符,content的值为这些字符。2.从一个标签开始到一个标签结束,content为标签中包含的字符。3.从一个标签到行结束,存在字符,content为这些字符

xml.sax解析代码:

# coding=utf-8
import xml.sax

data_list = []


class MyContentHandler(xml.sax.ContentHandler):

    def __init__(self):
        super().__init__()
        self.currentData = ""
        self.name = ""
        self.age = ""
        self.gender = ""

    def startDocument(self):
        print("开始解析xml")

    def endDocument(self):
        print("解析xml结束")

    def startElement(self, name, attrs):
        self.currentData = name

    def endElement(self, name):
        global data_list
        if name == 'name':
            data_list.append(self.name)
        elif name == 'age':
            data_list.append(self.age)
        elif name == 'gender':
            data_list.append(self.gender)

    def characters(self, content):
        if self.currentData == "name":
            self.name = content
        elif self.currentData == "age":
            self.age = content
        elif self.currentData == "gender":
            self.gender = content


if __name__ == '__main__':
    saxParse = xml.sax.make_parser()
    saxParse.setFeature(xml.sax.handler.feature_namespaces, 0)  # 关闭命名解析
    handler = MyContentHandler()
    saxParse.setContentHandler(handler)
    saxParse.parse('xml_data.xml')
    print(data_list)

运行结果:
运行结果

扫描二维码关注公众号,回复: 5948957 查看本文章
  • DOM(Document Object Model,文档对象模型)解析xml数据

DOM(文档对象模型)是W3C组织推荐处理可扩展标记语言的标准编程接口。
DOM读取xml文件内容的基本操作:1.parse解析器(读取内容),2.DOM函数处理xml数据。

DOM对象的相关函数

接口对象名 说明
DOMImplementation DOM对象底层实现
Node 文档中大多数对象的基本接口
NodeList 节点列表接口
DocumentType 文档声明信息
Document 整个文档对象
Element 元素节点
Attr 属性节点
Comment 在源文档中表示评论
Text 节点中包含的文本内容
ProcessingInstruction 处理指令

dom解析xml数据示例代码:

# coding=utf-8
import xml.dom.minidom

data_list = []

if __name__ == '__main__':
    document_tree = xml.dom.minidom.parse('xml_data.xml')
    collection = document_tree.documentElement # 获取所有元素
    print(collection.toxml())
    name_node = document_tree.getElementsByTagName("name")[0]
    name = name_node.childNodes[0].data
    data_list.append(name)
    age_node = document_tree.getElementsByTagName("age")[0]
    age = age_node.childNodes[0].data
    data_list.append(age)
    gender_node = document_tree.getElementsByTagName("gender")[0]
    gender = gender_node.childNodes[0].data
    data_list.append(gender)
    print(data_list)

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhe_ge_sha_shou/article/details/84963900