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

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

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

tree = 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 ET
data = 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 ET
tree = ET.ElementTree(file="country.xml")  # <xml.etree.ElementTree.ElementTree object at 0x03031390>
root = tree.getroot()  # <Element 'data' at 0x030EA600>

四、遍历

import xml.etree.ElementTree as ET

tree = 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 ET
except ImportError:
    import xml.etree.ElementTree as ET


if __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
    # elements
    root.findall("./country/neighbor")

    # Nodes with name='Singapore' that have a 'year' child
    root.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 parent
    root.findall(".//neighbor[2]")

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐