术业有专攻: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的主要内容,如果未能解决你的问题,请参考以下文章

你总问,全面发展还是术业专攻?这就是答案

术业专攻 | 如何让Java Web性能翻倍?

python实现XML解析的三种方法

装逼语录:

初入社会的年轻人如何选择行业?

金木研