Python解析xml数据

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)

运行结果:
运行结果

  • DOM(Document Object Model,文档对象模型)解析xml数据

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

DOM对象的相关函数

接口对象名说明
DOMImplementationDOM对象底层实现
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)

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

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值