博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 解析与生成xml
阅读量:6477 次
发布时间:2019-06-23

本文共 3675 字,大约阅读时间需要 12 分钟。

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

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

  • 解析XML

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

76.7371
112.0698
93.5142
126.666
ship
51.4033
179.954
62.1409
178.3398
ship

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

import xml.etree.ElementTree as ETtree = 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': '00'}object {
'id': '01'}

 

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

>>>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("
python")>>>list(parser.read_events())[('start',
)]>>>parser.feed(" tutorial
")>>>for event,elem in parser.read_events():... print(event)... print(elem.tag,"text=",elem.text)... endbook text= python tutorial
  •  找到感兴趣的element

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

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

 

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 00ship 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': '00', 'updated': 'yes'}

 

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

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

 

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

bounding_boxes>            
76.7371
112.0698
93.5142
126.666
51.4033
179.954
62.1409
178.3398
ship

 

  • 创建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)

 

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

转载于:https://www.cnblogs.com/catpainter/p/8504997.html

你可能感兴趣的文章
App工程结构搭建:几种常见Android代码架构分析
查看>>
使用openssl进行证书格式转换
查看>>
ZOJ 3777 Problem Arrangement
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
观察者模式
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>
struct和typedef struct
查看>>
cell reuse & disposebag
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>
js判断移动端是否安装某款app的多种方法
查看>>
学习angularjs的内置API函数
查看>>
4、输出名称 Exported names
查看>>