xml.etree.ElementTree模块为xml文件的提取和建立提供了简单有效的API。下文中使用ET来代表xml.etree.ElementTree模块。

XML是一种内在的分层的数据形式,展示这种数据最自然的方式就是树形结构。ET有两种类来实现这个目标——Elementree将整个XML文件构造成一棵树,Element代表书树一个节点。与整个文件的交互(从文件读或者写)一般在Elementtree层次完成,与一个简单的XML element以及它的sub-element交互一般在Element层次完成。

  • 解析XML

用下面的XML文件来完成后面的代码中对xml的提取

<?xml version = "1.0" ?>
<bounding_boxes>
<object id = "00">
<bndbox>
<xmin>76.7371</xmin>
<ymin>112.0698</ymin>
<xmax>93.5142</xmax>
<ymax>126.666</ymax>
</bndbox>
<name>ship</name>
</object> <object id = "01">
<bndbox>
<xmin>51.4033</xmin>
<ymin>179.954</ymin>
<xmax>62.1409</xmax>
<ymax>178.3398</ymax>
</bndbox>
<name>ship</name>
</object>
</bounding_boxes>

可以通过读取一个文件来导入数据:

import xml.etree.ElementTree as ET
tree = ET.pares("Annotations0001.xml")
root = tree.getroot()

也可以直接从一个字符串读入:

root = ET.fromstring(Annotations)

fromstring()直接将一个字符串从xml解析成树根的Element。

作为一个Elment,root有一个tag和一个字典属性:

>>>root.tag
'bounding_boxes'
>>>root.attrib
{}

它也有可以迭代的孩子节点:

for child in root:
print(child.tag,child.attrib) object {'id': ''}
object {'id': ''}

孩子是可以嵌套的,因此我们可以通过索引来访问特定的孩子:

>>>root[0][1].text
'ship'

注意:并不是所有的XML输入的element都是以解析树的element结束。现在,这个模块跳过了输入中所有的XML注释、处理指令和文件类型说明。然而,通过这个模块的API构造而不是通过解析XML文件构造的树可以包括注释和处理指令,这些会在生成XML输出中体现出来。一个文件类型的声明可以通过传递一个TreeBuilder实例给XMLParser构造函数来实现。

  • 非阻塞解析

在ET模块中的大多数解析函数都要求在返回结果之前一次性读入整个文件。使用XMLParser并且逐渐的填入数据是可能的,但是它是一个调用回调目标的push API,对于大多数需求这样很不方便并且层次很低。有时候在享受构造整个Element目标方便的同时,使用者只是想逐渐解析XML而不要阻塞操作。

完成这个功能最强大的工具就是XMLPullParser。它不要求阻塞式读入所有数据,而是通过调用XMLPullParser.feed()函数来逐渐填入数据。为了的到解析的XML element,可以调用XMLPullParser.read_events()。下面是例子:

>>>parser = ET.XMLPullParser(['start','end'])
>>>parser.feed("<book>python")
>>>list(parser.read_events())
[('start', <Element 'book' at 0x032FA6F0>)]
>>>parser.feed(" tutorial</book>")
>>>for event,elem in parser.read_events():
... print(event)
... print(elem.tag,"text=",elem.text)
...
end
book text= python tutorial
  • 找到感兴趣的element

Element有一些有用的方法来帮助用户递归迭代该节点的子树:

>>>for obj in root.iter('name'):
... print(obj.text)
...
ship
ship

Element.findall()可以找到所有该Element下所有的直接孩子。Element.find()特定标签下的第一个孩子,Element.text是指该element的文本。Element.get()的事element的属性。

for obj in root.findall("object"):
name = obj.find('name').text
print(name,obj.get("id")) ship 00
ship 01
  • 修改一个XML文件

ElemenrtTree提供了一个简单的构造XML文件并写入的方法。ElementTree.write()方法完成这个功能。

一旦一个Element object被创建,就可以直接修改它的域(比如Element.text),添加和修改属性(Element.set()方法),也可以添加孩子结点(Element.append())

>>>obj = root.find("object")
>>>obj.set("updated","yes")
>>>obj.attrib
{'id': '', 'updated': 'yes'}

也可以通过使用函数Element.remove()来移除element

>>>name = obj.find("name")
>>>obj.remove(name)
>>>tree.write("Annotations0001.xml")

移除之后XML文件变成如下这个样子:

bounding_boxes>
<object id="00" updated="yes">
<bndbox>
<xmin>76.7371</xmin>
<ymin>112.0698</ymin>
<xmax>93.5142</xmax>
<ymax>126.666</ymax>
</bndbox>
</object> <object id="01">
<bndbox>
<xmin>51.4033</xmin>
<ymin>179.954</ymin>
<xmax>62.1409</xmax>
<ymax>178.3398</ymax>
</bndbox>
<name>ship</name>
</object>
</bounding_boxes>
  • 创建XML文件

SubElement()函数提供了一个创建给定element的sub-element的简单方法:

>>>root = ET.Element("root")
>>>child1 = ET.SubElement(root,"child1")
>>>child2 = ET.SubElement(root,"child2")
>>>grandson = ET.SubElement(child2,"grandson")
>>>ET.dump(root)
<root><child1 /><child2><grandson /></child2></root>

参考文件:https://docs.python.org/3.5/library/xml.etree.elementtree.html

python 解析与生成xml的更多相关文章

  1. 使用Pull解析器生成XML文件和读取xml文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  2. SAX解析和生成XML文档

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

  3. python解析VOC的xml文件并转成自己需要的txt格式

    在进行神经网络训练的时候,自己标注的数据集往往会有数据量不够大以及代表性不强等问题,因此我们会采用开源数据集作为训练,开源数据集往往具有特定的格式,如果我们想将开源数据集为我们所用的话,就需要对其格式 ...

  4. maven中使用dom4j解析、生成XML的简易方法

    此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...

  5. 使用Pull解析器生成XML文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  6. python xml文件解析 及生成xml文件

    #解析一个database的xml文件 """ <databaselist type="database config"> <dat ...

  7. Python:Dom生成XML文件(写XML)

    http://www.ourunix.org/post/327.html 在python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文 ...

  8. python cookbook第三版学习笔记七:python解析csv,json,xml文件

    CSV文件读取: Csv文件格式如下:分别有2行三列. 访问代码如下: f=open(r'E:\py_prj\test.csv','rb') f_csv=csv.reader(f) for f in ...

  9. java 解析并生成 XML

    在 java 中使用 Dom4j 解析 XML 对 XML 文件的解析,通常使用的是 Dom4j 和 jdom 作为XML解析工具. 在此只介绍下 Dom4j 对 XML 文件的解析使用方法. 1. ...

随机推荐

  1. SVN的常用功能使用教程

    (一)导入项目到版本库中 1. 在SVN服务器的仓库中新建项目名称文件夹 2. 选择安装Visual SVN的本地计算机中的一个文件夹,右键选择导入,将本地项目导入到SVN服务中央仓库中 3. 输入在 ...

  2. 免费api

    聚合数据提供30大类,100种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免费的各类API接口. 聚合的免费API接口数据: 手机号码归属地API接口:https://www. ...

  3. JavaScript中的方法事件和函数的方法的三种方法

    js中的很多事件  而事件相对应的就是方法(函数 )那么今天所说的就是这三种方法      已onclick事件为例 1: 基本方法 <div id="a" onclick= ...

  4. intellij idea 破解教程

    首先呼吁:抵制盗版,抵制盗版,抵制盗版 如果只是个人开发学习用,那么下面的教程可能比较适合你了 有两种方法,第一种:Activate--License server,在License server a ...

  5. 数据库锁机制(以MySQL为例)

    选自:https://blog.csdn.net/aluomaidi/article/details/52460844 https://www.zhihu.com/question/51513268/ ...

  6. JAVA创建子进程并处理waitFor() 阻塞问题

    虽然很想休息,但是想想还是要把今天学的东西记下来,不然以后再用还是新知识. 新建一个线程类读取子进程的汇报信息和错误信息,避免阻塞 class StreamGobbler extends Thread ...

  7. 关于VUE调用父实例($parent) 根实例 中的数据和方法

    this.$parent或者 this.$root 在子组件中判断this.$parent获取的实例是不是父组件的实例 在子组件中console.log(this.$parent)  在父组件中con ...

  8. mac显示影藏文件

    http://blog.csdn.net/xiaoyuanzhiying/article/details/46694577 然后finder强制退出,然后重启.

  9. Java的三种代理模式(Proxy,CGLib)

    1.静态代理,这种不用说最不靠谱.每个类一个代理,代码量很大. 2.JDK代理.使用java.lang.reflect.Proxy进行代理,但是被代理的类必须要实现接口. 3.Cglib代理.不用实现 ...

  10. Go语言学习之3 流程控制、函数

    主要内容: 1. strings和strconv使用2. Go中的时间和日期类型3. 指针类型4. 流程控制5. 函数详解 1. strings和strconv使用 //strings . strin ...