Python解析XML
Python解析XML文件
文本记录如何利用python解析XML文件:
首先,XML示例文件如下所示(test.xml):
<?xml version="1.0" encoding="ISO-8859-1"?> <data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
1. 导入解析XML文件的模块:xml.etree.ElementTree
import xml.etree.ElementTree as ET
注:解析XML方法很多,这里只介绍其一,xml.etree.ElementTree是按照XML文件的格式,将其看作树来解析。
2. 解析步骤:
(1) 实例化Element对象:
tree = ET.ElementTree()
可见直接调用ET模块的ElementTree方法返回一个Element对象,该对象指向XML树的根节点。
现在来介绍Element对象的几个常用属性:
- tag:获取该元素节点的标签。 比如根节点的标签是<data>,那么tree.tag返回的就是字符串data
- attrib:获取噶元素节点的属性字典,没有属性就返回空字典。 比如元素标签为country的节点的属性为name='Liechetenstein'那么返回的就是字典{name : 'Liechetenstein'}
- text:若该元素内没有再嵌套,那么返回的就是该元素的内容(类型视元素内容的类型而定)。 比如year元素调用text后返回的是2008
(2)载入XML文件:
上一步仅仅是创建了XML树的对象,其中没有内容,现在就要载入xml文件来使这颗XML树具有具体含义。
tree.parse("test.xml")
Element对象调用parse方法将xml文件载入进来,其中parse方法的参数便是xml文件的路径。
这样,这颗xml树就要具体含义了,其含义与载入的xml文件含义同。
(3) 现在开始操作xml树(操作xml文件的内容):
1. 载入xml文件后的树是指向根节点的:
print(tree.tag)
输出:
2. 可以使用len()函数查看该节点的子节点个数:
print(len(tree))
3. 可以按下标索引子节点:
比如tree[0].tag的结果是country,意思是根节点的第一个子节点的标签是country
4. Element对象的findall()方法:
tree.findall('country')
该方法接受参数为检索的元素标签(String类型),返回的是一个列表(列表中的每个值都是Element对象,即检索到的元素):
比如:
children = tree.findall('country') # 调用方法findall,会在tree的子节点中寻找以country为标签的元素,将找到的元素放入列表中,最后返回这个列表 for child in children: # for循环遍历这个列表中的每个元素,循环体print语句输出每个元素的长度 print(len(child))
运行结果如下所示:(可以对比test.xml文件来理解输出)
5. 也可以使用find()函数:
child1 = tree[0] # child1锁定到tree的第一个孩子结点 print(child1.find('year').text) # child.find('year')指向该节点的year元素,然后.text返回该元素的内容
运行结果:(果然不出所料)
一次性操作xml文件示范代码:
childtag = tree[0].tag # 根目录的孩子结点的标签 children = tree.findall(childtag) # 返回所有根目录孩子结点元素的列表 for child in children: # 遍历该列表 for i in range(len(child)): # 获取每个孩子结点元素的长度,然后遍历输出所有内容 print(child[i].tag + ':' + str(child[i].text)) print()
运行结果如下:
(4)写XML文件
import xml.etree.ElementTree as ET root = ET.Element('data') # 创建根节点调用方法Element # 创建子节点用方法SubElement,其中第一个参数为他的父节点,第二个参数为该节点的标签 # 第三个参数为该节点的属性(可选) student = ET.SubElement(root,'student',sex = 'boy') # 创建子节点,其父节点为student,用text来设置该节点的内容 ET.SubElement(student,'name').text = 'Tony' ET.SubElement(student,'age').text = '22' # 与student节点同级的节点 student = ET.SubElement(root,'student',sex = 'girl') ET.SubElement(student,'name').text = 'Tina' ET.SubElement(student,'age').text = '21' # xml的写工作完成后调用ElementTree方法创建一颗xml树 # 其参数为Element类型,即这颗树的根 tree = ET.ElementTree(root) # ElementTree对象调用write方法,将数写入到xml文件中 # 第一个参数为文件路径,第二个参为编码格式(记得写) tree.write('test.xml',encoding='utf-8')
运行结果如下:
---------------------------------------------------------- 参考API ---------------------------------------------------------------
1.函数
1.xml.etree.ElementTree.Comment(text=None):注释元素工厂,这个工厂函数创建一个特殊的元素,将被序列化为XML注释标准的序列化器。注释字符串可以是bytestring或Unicode字符串,文本是包含注释字符串的字符串,返回表示注释的元素实例。
注意:XMLParser忽略了输入中的注释,而不是为它们创建注释对象。如果ElementTree使用其中一个元素方法插入到树中,它只会包含注释节点。
2.xml.etree.ElementTree.dump(elem):把元素树或元素结构写入sys.stdout。这个函数只用于调试。
3.xml.etree.ElementTree.fromstring(text):从字符串常量解析XML,XML()方法解析的方式也一样,它们返回的都是一个Element实例。
4.xml.etree.ElementTree.iselement(element):检查对手是否是有效的element对象,如果是element对象返回true,否则返回false.
5.xml.etree.ElementTree.iterparse(source, events=None, parser=None):在元素树中逐步解析XML,并且报告用户的情况。资源是文件名或包含xml数据的文件对象。一系列的事件需要被报告,支持事件的字符串有 “start”, “end”, “start-ns” and “end-ns”,如果忽略事件,则只报告“end”事件。解析器是一个可选的解析器实例。如果没有给出,则使用标准的XMLParser解析器。解析器必须是XMLParser的子类,并且只能使用默认的TreeBuilder作为目标。使用iterparse()函数返回一个迭代器对象。
6.xml.etree.ElementTree.parse(source, parser=None):把XML文件解析成 element tree,资源是一个文件名或包含XML数据的文件对象,解析器是一个可选的解析器实例。如果没有指定parser的参数值,默认使用的是XMLParser解析器。调用此函数返回ElementTree实例对象。
7.xml.etree.ElementTree.ProcessingInstruction(target, text=None):返回一个元素实例,表示一个处理指令。
8.xml.etree.ElementTree.register_namespace(prefix, uri):注册命名空间前缀, registry是全局的,任何现有的前缀或名称空间URI的映射都将被删除。这个命名空间中的标签和属性将被给定的前缀给序列化。
9.xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra):此函数是一个Subelement工厂,这个函数用于创建 element 实例,并将其添加到现有的 element 中。
10.xml.etree.ElementTree.tostring(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True): 转化为字符串。
01.element:表示一个element实例
02. encoding:默认编码是”us-ascii”
03.method:默认是”xml”,可以选择“html”、“text”
11.xml.etree.ElementTree.tostringlist(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True):转化成字符串列表。
12.xml.etree.ElementTree.XML(text, parser=None):
01.text :包含xml数据的字符串。
02.parser:解析器默认是XMLParser
03.返回的是一个Element实例
13.xml.etree.ElementTree.XMLID(text, parser=None):返回一个包含Element实例和字典的元组。
2.Element 对象
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)
1.tag: 标签
2.text: 去除标签,获得标签中的内容。
3.attrib: 获取标签中的属性和属性值。
4.tail: 这个属性可以用来保存与元素相关联的附加数据。它的值通常是字符串,但可能是特定于应用程序的对象。
Element 对象的方法
1.clear():清除所有子元素和所有属性,并将文本和尾部属性设置为None。
2.get(attribute_name, default=None):通过指定属性名获取属性值。
3.items():以键值对的形式返回元素属性。
4.keys():以列表的方式返回元素名。
5.set(attribute_name,attribute_value):在某标签中设置属性和属性值。
6.append(subelement):将元素子元素添加到元素的子元素内部列表的末尾。
7.extend(subelements):追加子元素。
8.find(match, namespaces=None):找到第一个匹配的子元素,match可以是标签名或者path。返回Elememt实例或None。
9.findall(match, namespaces=None):找到所有匹配的子元素,返回的是一个元素列表。
10.findtext(match, default=None, namespaces=None):找到匹配第一个子元素的文本。返回的是匹配元素中的文本内容。
11.getchildren():Python3.2后使用 list(elem) 或 iteration.
12.getiterator(tag=None):Python3.2后使用 Element.iter()
13.iter(tag=None):以当前元素为根创建树迭代器。迭代器遍历这个元素和它下面的所有元素(深度优先级)。如果标签不是None或’*’,那么只有标签等于标签的元素才会从迭代器返回。如果在迭代过程中修改树结构,则结果是未定义的。
14.iterfind(match, namespaces=None):匹配满足条件的子元素,返回元素。
15.itertext():创建一个文本迭代器。迭代器循环遍历此元素和所有子元素,以文档顺序,并返回所有内部文本。
16.makeelement(tag, attrib):此方法使用SubElement()函数代替。
17.remove(subelement):删除子元素。
3.ElementTree 对象
class xml.etree.ElementTree.ElementTree(element=None, file=None):
ElementTree是一个包装器类,这个类表示一个完整的元素层次结构,并为标准XML的序列化添加了一些额外的支持。
1._setroot(element):替换根元素,原来的根元素中的内容会消失。
2.find(match, namespaces=None):从根元素开始匹配和 Element.find()作用一样。
3.findall(match, namespaces=None):从根元素开始匹配和 Element.findall()作用一样。
4.findtext(match, default=None, namespaces=None):从根元素开始匹配和 Element.findtext()作用一样。
5.getiterator(tag=None):Python3.2后使用 ElementTree.iter() 代替。
6.iter(tag=None):迭代所有元素
7.iterfind(match, namespaces=None):从根元素开始匹配和 Element.iterfind()作用一样。
8.parse(source, parser=None):解析xml文本,返回根元素。
9.write(file, encoding=”us-ascii”, xml_declaration=None, default_namespace=None, method=”xml”, *, short_empty_elements=True):写出XML文本。