xml基础(一)
xml是用来结构化传输和存储数据的。
元素:
xml元素是从(且包括)开始标签直到(且包括)结束标签的部分。
例如:下面这个就是一个元素,
book是这个元素的名称。category是元素的属性,后面跟的是属性的内容,属性的内容必须用双引号引起来。
title也是一个元素,只不过是book的子元素。Harry Potter是这个元素的文本内容(text)
<book category="CHILDREN"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
xml必须有且只有一个根元素,上面例子的book就是根元素。下面的title、author等就是子元素。
xml是大小写敏感的。book和Book是不同的。
那么对应的Python中有个xml处理库,xml处理库下面有这些子模块:
-
xml.etree.ElementTree
: ElementTree API,一个简单而轻量级的XML处理器
-
xml.dom
:DOM API 定义 -
xml.dom.minidom
:最小的 DOM 实现 -
xml.dom.pulldom
:支持构建部分 DOM 树
-
xml.sax
:SAX2 基类和便利函数 -
xml.parsers.expat
:Expat解析器绑定
里面有几种不同解析xml文件的思路:
ElementTree是将xml文件抽象成一棵树,是一个轻量级的dom,具有方便友好的API。代码可用性好,速度快,消耗内存少。
dom是将 XML 文档作为一个树形结构,而树叶被定义为节点,通过对树的操作来操作XML。
SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
那么先看这个ElementTree吧。。。。
有两个类: ElementTree
将整个XML文档表示为一个树, Element
表示该树中的单个节点。与整个文档的交互(读写文件)通常在 ElementTree
级别完成。与单个XML元素及其子元素的交互是在 Element
级别完成的。
先说这个Element,
Element
(tag, attrib={}, **extra)
tag
一个标识此元素,意味着何种数据的字符串(换句话说,元素类型或叫名称)。
attrib
是该元素的属性,是可选的,属性使用字典格式来定义。
extra包含额外的属性,作为关键字参数提供
新建一个Element:
import xml.etree.ElementTree as ET
ele=ET.Element(tag)
#添加属性
ele.attrib={"attrib_name":attrib}
#添加内容
ele.text=text
下面是方法:
ele.clear()
该函数删除所有子元素,清除所有属性,并将文本和尾部属性设置为None。
ele.get(key, default=None)
获取名为key的元素属性,返回属性值,如果没有找到属性,则返回默认值
ele.items()
以(名称、值)对序列的形式返回元素属性。属性以任意顺序返回。
ele.keys()
以列表(list)的形式返回元素属性名。名称以任意顺序返回。
ele.set(key, value)
将元素的属性key设置为value。也可以用它来增加属性
ele.append(subelement)
将元素子元素(subelement)添加到该元素的内部子元素列表的末尾。如果子元素不是元素,则引发类型错误。
ele.extend
(subelements)
用零个或多个元素追加序列对象的子元素。如果子元素不是元素,则引发类型错误。
ele.find
(match, namespaces=None)
查找第一个匹配的子元素。匹配可以是标记名(tag)或路径(path)。返回一个元素实例或一个也不返回。
ele.findall
(match, namespaces=None)
根据标记名或路径查找所有匹配的子元素。返回一个按文档顺序包含所有匹配元素的列表
ele.findtext
(match, default=None, namespaces=None)
查找第一个匹配的子元素的文本。匹配可以是标记名或路径。返回第一个匹配元素的文本内容,如果没有找到元素,则返回默认值。
ele.insert
(index, subelement)
在元素中给定的位置插入子元素。如果子元素不是元素,则引发类型错误。
ele.iter
(tag=None)
创建一个以当前元素为根的树迭代器。迭代器按文档(深度优先)顺序遍历这个元素和它下面的所有元素。如果tag不是None或'*',则迭代器只返回标记等于tag的元素。如果在迭代期间修改了树结构,则结果是未定义的。
ele.iterfind
(match, namespaces=None)
根据标记名或路径查找所有匹配的子元素。返回一个可迭代的,以文档顺序产生所有匹配的元素。名称空间是从名称空间前缀到全名的可选映射
ele.itertext
()
创建文本迭代器。迭代器按文档顺序遍历此元素和所有子元素,并返回所有内部文本
remove
(subelement)
从元素中移除子元素。与find*方法不同,此方法基于实例标识(而不是基于标记值或内容)对元素进行比较