python ElementTree
2022-10-08 17:22:18
102
{{single.collect_count}}


ElementTree将整个XML文档表示为树,并 Element表示此树中的单个节点。与整个文档的交互(读取和写入文件)通常在ElementTree关卡上完成。与单个XML元素及其子元素的交互在该Element级别上完成。

一、调用parse()方法,返回解析树

try:import xml.etree.cElementTree as ETexcept ImportError:import xml.etree.ElementTree as ETtree = ET.parse('country.xml')# <xml.etree.ElementTree.ElementTree object at 0x00000230D5DDF1C0>root = tree.getroot()# <Element 'data' at 0x0000021AE8F79540>type:<class 'xml.etree.ElementTree.Element'>

二、调用from_string(),返回解析树的根元素

import xml.etree.ElementTree as ETdata = open("country.xml").read()root = ET.fromstring(data) # <Element 'data' at 0x036168A0>

三、调用ElementTree类ElementTree(self, element=None, file=None) # 这里的element作为根节点

import xml.etree.ElementTree as ETtree = ET.ElementTree(file="country.xml")# <xml.etree.ElementTree.ElementTree object at 0x03031390>root = tree.getroot()# <Element 'data' at 0x030EA600>

四、遍历

import xml.etree.ElementTree as ETtree = ET.parse("country.xml")root = tree.getroot()# 遍历xml文档的第二层for child in root:# 第二层节点的标签名称和属性print(child.tag,":", child.attrib) # 遍历xml文档的第三层for children in child:# 第三层节点的标签名称和属性print(children.tag, ":", children.attrib)

Element对象方法

类方法作用
Element.getchildren()
Element.getiterator(tag=None)
Element.iter(tag=None)遍历该Element所有后代,也可以指定tag进行遍历寻找。
Element.iterfind(path, namespaces=None)根据tag或path查找所有的后代。
Element.itertext()遍历所有后代并返回text值。
Element.findall(path)查找当前元素下tag或path能够匹配的直系节点。
Element.findtext(path, default=None, namespaces=None)寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
Element.find(path)查找当前元素下tag或path能够匹配的首个直系节点。
Element.text获取当前元素的text值。
Element.get(key, default=None)获取元素指定key对应的属性值,如果没有该属性,则返回default值。
Element.keys()返回元素属性名称列表
Element.items()返回(name,value)列表
Element.getiterator(self, tag=None)

注意:Element.findall()或者Element.find()方法,只会从结点的直接子结点中查找,并不会递归查找。

示例:过滤出所有neighbor标签

# 过滤出所有neighbor标签for neighbor in root.iter("neighbor"):print(neighbor.tag, ":", neighbor.attrib)

示例:遍历所有的counry标签

# 遍历所有的counry标签for country in root.findall("country"):# 查找country标签下的第一个rank标签rank = country.find("rank").text# 获取country标签的name属性name = country.get("name")print(name, rank)

xml.etree.ElementTree.Element 属性相关

类成员获取方法
节点名(tag)(str)Element.tag
属性(attributes)(dict)Element.attrib
文本(text)(str)Element.text
附加文本(tail) (str)Element.tail
子节点列表(list)Element[:]

ElementTree对象

以下方法与Element类中同名方法近似,区别在于它们指定以根节点作为操作对象。

类成员获取方法
find(match)
findall(match)
findtext(match, default=None)
getroot()获取根节点
iter(tag=None)
iterfind(match)
parse(source, parser=None)装载xml对象,source可以为文件名或文件类型对象.
write(file, encoding=“us-ascii”, xml_declaration=None, default_namespace=None,method=“xml”)

五、模块方法

函数方法Value
xml.etree.ElementTree.canonicalize(xml_data=None, *, out=None, from_file=None, **options)
xml.etree.ElementTree.Comment(text=None)创建一个特别的element,通过标准序列化使其代表了一个comment。comment可以为bytestring或unicode。
xml.etree.ElementTree.dump(elem)生成一个element tree,通过sys.stdout输出,elem可以是元素树或单个元素。这个方法最好只用于debug。
xml.etree.ElementTree.fromstring(text, parser=None)text是一个包含XML数据的字符串,与XML()方法类似,返回一个Element实例。
xml.etree.ElementTree.fromstringlist(sequence, parser=None)从字符串的序列对象中解析xml文档。缺省parser为XMLParser,返回Element实例。
xml.etree.ElementTree.indent(tree, space=’ ', level=0)
xml.etree.ElementTree.iselement(element)检查是否是一个element对象。
xml.etree.ElementTree.iterparse(source, events=None, parser=None)将文件或包含xml数据的文件对象递增解析为element tree,并且报告进度。events是一个汇报列表,如果忽略,将只有end事件会汇报出来。
xml.etree.ElementTree.parse(source, parser=None)将一个文件或者字符串解析为element tree。
xml.etree.ElementTree.ProcessingInstruction(target, text=None)这个方法会创建一个特别的element,该element被序列化为一个xml处理命令。
xml.etree.ElementTree.register_namespace(prefix, uri)注册命名空间前缀。这个注册是全局有效,任何已经给出的前缀或者命名空间uri的映射关系会被删除。
xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)子元素工厂,创建一个Element实例并追加到已知的节点。
xml.etree.ElementTree.tostring(element, encoding=‘us-ascii’, method=‘xml’, *, xml_declaration=None, default_namespace=None, short_empty_elements=True)生成一个字符串来表示表示xml的element,包括所有子元素。element是Element实例,method为"xml",“html”,“text”。返回包含了xml数据的字符串。
xml.etree.ElementTree.tostringlist(element, encoding=‘us-ascii’, method=‘xml’, *, xml_declaration=None, default_namespace=None, short_empty_elements=True)生成一个字符串来表示表示xml的element,包括所有子元素。element是Element实例,method为"xml",“html”,“text”。返回包含了xml数据的字符串列表。
xml.etree.ElementTree.XML(text, parser=None)从一个字符串常量中解析出xml片段。返回Element实例。
xml.etree.ElementTree.XMLID(text, parser=None)从字符串常量解析出xml片段,同时返回一个字典,用以映射element的id到其自身。

在ET上使用xpath

try:import xml.etree.cElementTree as ETexcept ImportError:import xml.etree.ElementTree as ETif __name__ == "__main__":tree = ET.parse('country.xml')root = tree.getroot()# 获取根# print(root, type(root))xml_str = ET.tostring(root)root = ET.fromstring(xml_str)# Top-level elements(当前节点就是根节点)root.findall(".")# All 'neighbor' grand-children of 'country' children of the top-level# elementsroot.findall("./country/neighbor")# Nodes with name='Singapore' that have a 'year' childroot.findall(".//year/..[@name='Singapore']")# 'year' nodes that are children of nodes with name='Singapore'root.findall(".//*[@name='Singapore']/year")# All 'neighbor' nodes that are the second child of their parentroot.findall(".//neighbor[2]")
回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}