术业有专攻:xml.etree.ElementTree
Posted lambda派
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了术业有专攻:xml.etree.ElementTree相关的知识,希望对你有一定的参考价值。
本文约2750字,建议阅读时间14~18分钟
关键字:python,xml,可扩展标记语言,xml.etree.ElementTree
xml.etree.ElementTree模块提供了一个简单且高效的解析和创建XML(可扩展标记语言)数据的API,但对于处理不可信或者未经证实的结构化数据将是不安全的。
XML是一种固定的层级结构数据形式,天然最好的方法就是使用树形结构来表示它。其中ElementTree代表XML文档的整棵树,Element代表树中的单个节点,整个文档的读写通常在ElementTree层级完成,单个元素或者子元素则在Element层级完成。
1、方法
(1)规范化
from xml.etree.ElementTree import canonicalize
xml_data='<title>text</title>'
canonicalize(xml_data=xml_data)
#返回’<title>text</title>’
#xml_data可以是字符串、文件路径或者文件对象等
#python3.8新增
(2)注释元素的生成
from xml.etree.ElementTree import Comment
Comment(text=None)
#返回表示注释的元素实例
(3)将元素进行系统标准输出
from xml.etree.ElementTree import dump
dump(elem)
#elem为一棵element tree或者独立的element
#仅适用于debug
(4)从文本生成Element
from xml.etree.ElementTree import fromstring
fromstring(text,parser=None)
#text为包含xml数据的字符串
#parser为解析器参数,如果没有指定将使用标准的XMLParser
#返回Element实例
(5)从一系列文本中生成Element
from xml.etree.ElementTree import fromstringlist
fromstring(sequence,parser=None)
#sequence为包含xml片段的字符串序列
#parser为解析器参数,如果没有指定将使用标准的XMLParser
#返回Element实例
(6)树的展示中缩进
from xml.etree.ElementTree import indent
indent(tree,space=’ ’,level=0)
#tree为Element或者ElementTree
#space为插入到缩进处的空格字符串,默认为两个空格字符串
#level为缩进的层次水平
#python3.9新增
(7)判断是否为element对象
from xml.etree.ElementTree import iselement
iselement(object)
#返回True或者False
(8)迭代解析
from xml.etree.ElementTree import iterparse
iterparse(source, events=None, parser=None)
#source为文件名或者包含xml数据的文件对象
#events为记录返回的事件序列,包括"start", "end", "comment", "pi", "start-ns"和"end-ns" ,ns事件表示详细的命名空间信息,如果省略,将只记录end事件
#parser为解析器参数,如果没有指定将使用标准的XMLParser,只能是XMLParser的子类
#返回(事件,元素)的二元组迭代器
(9)解析
from xml.etree.ElementTree import parse
parse(source, parser=None)
#source为文件名或者包含xml数据的文件对象
#parser为解析器参数,如果没有指定将使用标准的XMLParser,只能是XMLParser的子类
#返回ElementTree 实例
(10)处理指令
from xml.etree.ElementTree import ProcessingInstruction
ProcessingInstruction(target, text=None)
#该函数可以创建能被序列化为xml处理指令的特殊元素
#target为包含PI目标的字符串
#text为包含PI目录的文本
#返回element实例
(11)命名空间前缀的注册
from xml.etree.ElementTree import register_namespace
register_namespace(prefix, uri)
#命名空间的标签和属性将被序列化为给定的前缀
#prefix为命名空间前缀
#uri为命名空间的通用资源标志符
(12)创建element实例
from xml.etree.ElementTree import SubElement
SubElement(parent, tag, attrib={})
#元素名称、属性名称和属性值可以是字节串或者unicode字符串
#parent为父元素
#tag为子元素名称
#attrib为可选的属性字典
(13)生成表示xml元素的字符串
from xml.etree.ElementTree import tostring
tostring(element, encoding="us-ascii", method="xml", xml_declaration=None,
default_namespace=None, short_empty_elements=True)
#element为Element实例
#encoding为输出编码
#method包含"xml", "html"和"text"
#xml_declaration、default_namespace和 short_empty_elements在ElementTree.write()中的含义相同
#返回包含xml数据的编码字符串
#注:包含所有的子元素
(14)生成表示xml元素的字符串列表
from xml.etree.ElementTree import tostringlist
tostringlist(element, encoding="us-ascii", method="xml", xml_declaration=None,
default_namespace=None, short_empty_elements=True)
#element为Element实例
#encoding为输出编码
#method包含"xml", "html"和"text"
#xml_declaration、default_namespace和 short_empty_elements在ElementTree.write()中的含义相同
#返回包含xml数据的编码字符串列表
#注:包含所有的子元素
(15)从字符串解析xml片段
from xml.etree.ElementTree import XML
XML(text, parser=None)
#text为包含xml数据的字符串
#parser为解析器参数,如果没有指定将使用标准的XMLParser
#返回Element实例
(16)从字符串解析xml片段并返回字典
from xml.etree.ElementTree import XMLID
XMLID(text, parser=None)
#text为包含xml数据的字符串
#parser为解析器参数,如果没有指定将使用标准的XMLParser
#返回包含Element实例和字典的元组
2、Element对象
(1)对象的创建
from xml.etree.ElementTree import Element
Element(tag, attrib={})
#tag为元素名称
#attrib为属性键值对字典
(2)对象属性
文本:text
属性字典:attrib
(3)对象方法
对象重置:clear()
key属性值的获取:get(key,default=None)
#如果未找到相应的key,则返回default
获取属性键值二元组:items()
获取属性列表:keys()
将key属性值设置为value:set(key,value)
(4)对象子元素的方法
添加子元素:append(subelement)
#如果subelement不是Element对象将抛出TypeError
添加子元素序列:extend(subelements)
#subelements为子元素序列,如果subelement不是Element对象将抛出TypeError
寻找与match匹配的第一个子元素:
find(match, namespaces=None)
#match为标签名称或者路径
#namespaces为命名空间前缀与全名之间的映射
#返回Element对象或者None
寻找与match匹配的所有子元素:
findall(match, namespaces=None)
#match为标签名称或者路径
#namespaces为命名空间前缀与全名之间的映射
#返回有序的Element对象列表
寻找与match匹配的第一个子元素的文本:
findtext(match, default=None, namespaces=None)
#match为标签名称或者路径
#default为当未匹配到相应元素时返回的默认值
#namespaces为命名空间前缀与全名之间的映射
#返回有序的Element对象列表
向指定位置插入子元素:
insert(index, subelement)
#如果subelement不是Element对象将抛出TypeError
创建以当前元素为根的迭代树:
iter(tag=None)
#如果tag不为None或者*,将返回只与tag相同的元素迭代器
生成与match匹配的所有子元素迭代器:
iterfind(match, namespaces=None)
#match为标签名称或者路径
#namespaces为命名空间前缀与全名之间的映射
#返回有序的Element对象迭代器
创建文本迭代器:
itertext()
#返回所有元素中有序的文本
创建新的Element对象:
makeelement(tag, attrib)
#谨慎使用该方法,建议使用SubElement()
移除Element中的子元素:
remove(subelement)
#该方法与find方法不同之处在于它是根据对象的ID进行比较,而不是标签或者文本
此外,还包含如下方法:__delitem__(),__getitem__(), __setitem__(), __len__()。
3、ElementTree对象
(1)对象的创建
from xml.etree.ElementTree import ElementTree
ElementTree(element=None, file=None)
#element为根元素
#如果file指定,xml树将以该内容初始化
(2)对象方法
替代树中的根元素内容为element:
_setroot(element)
#谨慎使用
寻找与match匹配的第一个子元素:
find(match, namespaces=None)
#同Element.find(),从树的根节点开始
寻找与match匹配的所有子元素:
findall(match, namespaces=None)
#同Element.findall(),从树的根节点开始
寻找与match匹配的第一个子元素的文本:
findtext(match, default=None, namespaces=None)
#同Element.findtext(),从树的根节点开始
获取当前树的根节点:
getroot()
创建并返回根元素的树迭代器:
iter(tag=None)
#tag为寻找的标签,默认为返回所有元素
生成与match匹配的所有子元素迭代器:
iterfind(match, namespaces=None)
#同Element.iterfind(),从树的根节点开始
加载外部xml片段到树中:
parse(source, parser=None)
#source为文件名称或者文件对象
#parser为解析器参数,如果没有指定将使用标准的XMLParser
#返回根元素片段
将element tree写入文件:
write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", short_empty_elements=True)
#file为文件名或者打开的文件对象
#encoding为输出编码
#xml_declaration控制应该被添加到文件中的xml声明,包括False(从不)、True(一直)和None(US-ASCII或者UTF-8或者Unicode)
#default_namespace设置xml默认的命名空间,如xmlns
#method包含"xml", "html"和"text"
#short_empty_elements控制未包含文本的元素的形式,为关键字参数
#返回字符串或者字节
4、XMLParser对象
(1)对象的创建
from xml.etree.ElementTree import XMLParser
XMLParser( target=None, encoding=None)
#target为可选参数,省略将使用标准的TreeBuilder
# encoding为可选参数,指定编码方式
(2)对象方法
添加数据:
feed(data)
#data为编码数据
结束添加数据:close()
(完)
欢迎关注【lambda派】!
相关阅读:
以上是关于术业有专攻:xml.etree.ElementTree的主要内容,如果未能解决你的问题,请参考以下文章