文章目录
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]")