etree解析xml_术业有专攻: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='text'

canonicalize(xml_data=xml_data)

#返回’text’

#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()

(完)

ff7e4a3aff6b1ebf547af5ad23b62a0e.png

欢迎关注【lambda派】!

相关阅读:

术业有专攻:html与html.entities

术业有专攻:JSON解析模块json

术业有专攻:安全哈希模块hashlib

术业有专攻:ZIP文件操作模块zipfile

术业有专攻:I/O流操作模块io

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值