版权声明:本文为博主原创文章,未经博主允许不得转载。 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)
运行结果: