有些节点既是父节点,又是子节点html
下面来看下这两个类的定义及其提供的函数:python
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)
Element类对应的是树形结构中的每一个节点,对应的是XML文档中的标签对。咱们上面提到过XML标签有如下几个特征,除了子标签外都有相应的属性与之对应:sql
标签特征 | 对应的类属性 | 数据类型 |
---|---|---|
标签名称 | tag | 字符串 |
属性 | attrib | 字典,全部属性和属性值的集合 |
标签值 | text | 一般是字符串 |
与下一个标签之间的值 | tail | 一般是字符串 |
子标签 | 无 | 标签的父子关系是在SubElement中指定的 |
关于Element.text和Element.tail属性的说明:django
- 它们可被用于保存于该Element相关的额外数据;
- 它们的值一般是字符串,可是也能够是任何应用特定的对象类型;
- 若是Element对象是由一个XML建立而来的,那么
text
属性保存的是这个element的开始标签与它的第一个子标签或结束标签之间的文本,或者是None;而tail保存的是这个element的结束标签与下一个标签之间的文件或None,能够看下面的例子。
<a><b>1<c>2<d/>3</c></b>4</a>
# 以一个(name, value)的序列的形式返回该element全部属性,且属性在序列是随机的 items() # 返回该element全部属性的名称列表,属性名称顺序随机 keys() # 获取该element指定属性key的值 get(key, default=None) # 设置该element指定属性的值 set(key, value) # 重置当前element:删除全部的 subelemnts、清空全部属性、设置text和tail属性值为None clear()
# 向最后添加一个子标签
append(subelement)
# 向最后追加多个子标签,subelements是一个Element序列;这是Python 3.2中新增的方法
extends(subelements)
# 像该element的指定位置插入一个subelement
insert(index, subelement) # 返回第一个与match匹配的subelement或None,match能够是一个tag名称(标签名称),也能够是一个path find(match, namespaces=None) # 返回全部与match匹配的subelement列表或None,match能够是一个tag名称(标签名称),也能够是一个path findall(match, namespaces=None) # 返回第一个与match匹配的subelement的text属性值,若是匹配到的element没有text属性则返回一个空字符串,若是没有匹配到subelement则返回default参数定义的值 findtext(match, default=None, namespaces=None) # Python 3.2开始已将该方法废弃,请使用list(elem)或迭代 getchildren() # Python 3.2开始已将该方法废弃,改用Element.iter() getiterator(tag=None) # 这是Python 3.2中新增的方法。以当前element做为根建立一个tree迭代器,该迭代器会议深度优先的方式迭代这个element及其下面的全部elements。若是tag不是None或'*',则只有tag值等于tag参数所指定值的element才会被这个迭代器返回;若是树形结构在迭代过程当中被修改,则结果为undefined。 iter(tag=None) # 这是Python 3.2中新增的方法。查找与match参数指定的tag名称或path相匹配的全部subelements,返回一个以文档顺序产生全部匹配element的可迭代对象。 iterfind(match, namespaces=None) # 这是Python 3.2中新增的方法。建立一个迭代器,这个迭代器以文档顺序循环当前element和全部subelements并返回全部内部文本。 itertext() # 从当前element中移除指定的subelement remove(subelement)
SubElement(parent, tag, attrib={}, **extra)
parent参数表示父节点(标签对),它应该是一个Element类的实例。SubElement的其余属性和函数与Element相同。swift
ElementTree表示的是整个element层级关系,而且该类还添加了一些对标准XML序列化和反序列化的额外支持。app
class xml.etree.ElementTree.ElementTree(element=None, file=None)
element: 是一个Element实例,表示root element;函数
file: 是一个XML文件文成,若是该参数被给出,则会以该文件的内容初始化树形层次结构;ui
下面是ElementTree提供的方法:编码
# 以指定的element实例替换当前tree的root element,至关于把整个XML的内容替换掉了 _setroot(element) # 返回当前树形层级结构的root element getroot() # 与Element.find()功能相同,只是它是从树形结构的root element开始查找 find(match, namespaces=None) # 与Element.findall()功能相同,只是它是从树形结构的root element开始查找 findall(match, namespaces=None) # 与Element.findtext()功能相同,只是它是从树形结构的root element开始查找 findtext(match, default=None, namespaces=None) # Python 3.2开始已将该方法废弃,改用ElementTree.iter() getiterator(tag=None) # Python 3.2新增的方法。为当前root element建立并返回一个树迭代器,该迭代器将会按顺序循环这个树形结构的中的全部与tag匹配的elements,默认返回全部elements iter(tag=None) # Python 3.2新增的方法。与Element.iterfind()功能相同,只是它是从树形结构的root element开始查找 iterfind(match, namespaces=None) # 加载一个外部XML片段到当前element树并返回该XML片段的root element。source是一个文件名称或文件对象。parser是一个可选的parser实例,若是没有给出该参数,将会使用标准的XMLParser解析器。 parse(source, parser=None) # 将当前element tree以XML形式写入一个文件中。 # file 是一个文件名称或一个以写模式打开的文件对象 # encoding 用于指定输出编码 # xml_declaration 用于控制师傅将一个XML声明也添加到文件中(False表示添加、True表示不添加、None表示只有编码不是"US-ASCII"或"UTF-8"或"Unicode"时才添加) # default_namespace 设置默认的XML命名空间(“xmlns”) # method 可取值为"xml"、"html"和"text",默认为"xml" # short_empty_elements 是惟一一个关键字参数,是Python 3.4新增长的参数。它用于控制那些不包含任何内容的elements的格式,若是该参数值为Ture则这些标签将会被输出为一个单独的自关闭标签(如: <a/>),若是值为False则这些标签将会被输出为一个标签对(如:<a></a>) write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", *, short_empty_elements=True)
注意:spa
write()方法的输出能够是一个字符串(str),能够能够是二进制(bytes)。这是受encoding参数控制的:
- 若是encoding参数值为"unicode",则输出是一个字符串;
- 不然,输出时二进制字节。
若是file是一个(以可写模式)打开的文件对象,这有可能会发生冲突。所以,咱们须要肯定不会尝试将一个字符串写入一个二进制流,反之亦然。
xml.etree.ElementTree模块也直接提供了一些函数便于咱们直接对XML进行操做,下面来介绍几个经常使用的函数:
# 解析包含XML数据的字符串,返回一个Element实例 xml.etree.ElementTree.fromstring(text) # 生成并返回指定的Element实例对应的包含XML数据的字符串(encoding="unicode")或字节流 # 参数讲解请参考上面的ElementTree类的write()方法 xml.etree.ElementTree.toString(element, encoding="us-ascii", method="xml", *, short_empty_elements=True) # 解析包含XML数据的文件名或文件对象,返回一个ElementTree实例 xml.etree.ElementTree.parse(source, parser=None) # 将XML数据以递增的方式解析到元素树中,并向用户报告发生了什么(相似SAX的回调机制),最终返回一个提供(event, elem)对的迭代器(iterator)。 # source 是一个包含XML数据的文件名称或文件对象 # events 是一个包含要报告的事件序列,这里支持的事件包括:"start"、"end"、"start-ns"、"end-ns"(“ns”事件用于获取详细的命名空间信息)。若是event参数被省略,则仅报告"end"事件。 # parser是一个可选的解析器实例,若是为给出则使用标准的XMLParser解析器 xml.etree.ElementTree.iterparse(source, events=None, parser=None)
关于xml.etree.ElementTree.iterparse()方法的说明:
- 虽然它以递增的方式构建元素树,可是它仍然会锁定对source的读取操做。所以,它不适用于不能接受读阻塞的应用。
- 它只保证在发出一个“start”事件时,它已经看到了起始标签(tag)的">"结束字符,所以此时它定义了atrrib属性,可是text和tail属性的内容在那一时刻是没有被定义的(这一样适用于子元素)。若是你须要一个彻底填充的元素,请查找“end”事件。