Python_xml
xml: 可扩展标记语言,用来标记数据,定义数据类型,主要用来传输和存储数据(和json差不多,不同语言或程序之间进行数据交换的协议)
ET(xml.etree.ElementTree)中的几个类:
- ElementTree:表示整个xml层级结构
- Element:表示树形结构中所有的父节点
- SubElement:表示树形结构中所有的子节点
xml的标签特征:
| tag | 标签名称 | 为字符串类型 |
| attrib | 标签属性 | 为字典类型,是所有属性和属性值的集合 |
| text | 标签值 | 通常为字符串类型 |
| tail | 与下一个标签之间的值 | 通常为字符串类型 |
xml格式:
<site>
<name>hello</name>
<url>yeah</url>
</site>
<site>
<name>你好</name>
<url>嘿</url>
</site>
ET模块提供的几个函数:
| ET.fromstring(text) |
解析xml数据的字符串,返回一个element实例 |
| ET.toString(element,encoding='us-ascii',method='xml',*,short_empty_elements=True) | 生成返回指定的element实例对应的包含xml数据的字符串或字节流 |
| encoding: 用于指定输出编码 | |
| method :可取值‘xml’,‘heml’,‘text’,默认为xml | |
| short_empty_elememts : 用于控制不包含任何内容的elements格式,为True,这些标签将会被输出Wie一个单独的自关闭标签<a\>,若为False,则直接输出标签对<a></a> | |
| ET.parse() |
解析包含xml数据的文件名或文件对象,返回一个elementTree实例 |
| ET.iterparse(source, events=None, parser=None) | 将xml数据以递增的方式解析到元素树中,最后返回一个提供(event,elem)对的迭代器(iterator) |
| events :包含要报告的事件序列,‘start’,‘end’,‘start-ns’,‘end-ns’(ns 表示获取详细的命名空间信息),若 events被省略,则仅报告‘end’事件 | |
| parser : 可选的解析器实例,默认为标准的XMLParser解析器 |
ET中的三个类:
1.Element类
1>. Element 中用于操作标签属性attrib的方法(类似于字典):
| x.items() | 以(name, value)对的序列返回元素所有属性,且属性在生成序列时是随机的 |
| x.keys() | 返回该元素所有属性的名称列表(顺序随机) |
| x.get(key, default=None) | 获取该元素指定属性的key值 |
| x.set(key,value) | 设置/添加该元素指定属性的值 |
| x.clear() | 重置当前元素 |
2>. Element 中用于操作子标签(SubElement)的方法:
| append() | 向最后添加一个子标签 |
| extends() | 向最后追加多个子标签(列表的形式) |
| insert(index,subelement) | 向指定位置插入一个子标签 |
| find(match,namespaces=None) | 返回第一个与match匹配的标签或None |
| findall(match,namespaces=None) | 返回所有与match匹配的标签 |
| findtext(match,default=None,namespces=None) | 返回第一个与match匹配的子标签的text属性值,如果匹配到的元素没有text属性则返回一个空字符串,如果没有匹配到子标签则返回default参数定义的值 |
| iter(tag=None) | 以当前子标签作为根创建一个树迭代器,该迭代器会以深度优先的方式迭代这个元素及其下面的元素,若tag有指定值,则从指定值开始迭代 |
| iterfind(match,namespaces) | 查找与match参数指定的tag名称或相匹配的所有子元素,并返回迭代对象 |
| itertext() | 创建一个迭代器,以文档顺序返回内部文本所有元素 |
| remove() | 从当前元素中移除指定的子元素 |
2.ElementTree类
类中的方法:
| _setroot() |
以指定的元素替换当前树的根 元素,相当于把整个xml的内容替换掉 |
|
getroot() |
返回当前树形层级结构的根 元素 |
| find(match,namespaces=None) |
与Element.find()相同,从根开始查找 |
| findtext() |
与Element.findall()相同,从根开始查找 |
| iter() |
为当前根标签创建并返回一个树迭代器,并顺序与tag匹配,并默认返回所有元素 |
| iterfind() |
与Element.iterfind()相同,从根开始查找 |
| parse(source,parser) |
加载一个外部xml片段到当前标签,并返回该xml的根标签 |
|
write(file,encoding='us-ascii',xml_declaration=None, default_namespace=None,method='xml',*, short_empty_elements=Ture) |
将当前标签树以xml的形式写入文件 |
| default_namespace: 设置默认的xml命名空间 | |
| xml_declaration: 用于控制是否将一个xml声明也添加到文件中(False表示添加,True表示不添加,None表示编码不是‘us-ascii’或‘utf-8’或‘Unicode’时才添加) |
创建xml:
import xml.etree.cElementTree as ET
grandfather = ET.Element('爷爷') # 根节点
uncle = ET.SubElement(grandfather, '大伯', attrib={'性别': '男'}) # 子节点
age = ET.SubElement(uncle, 'age', attrib={'啦啦': '木办法'}) # uncle的子节点
work = ET.SubElement(uncle, 'work') # age 与work同级
child = ET.SubElement(uncle, 'child', attrib={'性别': '女'})
age.text = '' # 给age和name设值
work.text = '次饭饭'
child.text = '二丫'
uncle2 = ET.SubElement(grandfather, '二伯', attrib={'性别': '男'})
age = ET.SubElement(uncle2, 'age')
work = ET.SubElement(uncle2, 'work') # work 与age同级
child = ET.SubElement(uncle2, 'child', attrib={'性别': '男'})
age.text = ''
work.text = '打豆豆'
child.text = '二蛋'
et = ET.ElementTree(grandfather) # 生成文档对象
et.write('test.xml', encoding='utf-8', xml_declaration=True) # 注释声明的xml所用编码
# ET.dump(grandfather) # 打印生成格式
grandfather
结果:
<?xml version='1.0' encoding='utf-8'?>
<爷爷>
<大伯 性别="男">
<age 啦啦="木办法">45</age>
<work>次饭饭</work>
<child 性别="女">二丫</child>
</大伯>
<二伯 性别="男">
<age>44</age>
<work>打豆豆</work>
<child 性别="男">二蛋</child>
</二伯>
</爷爷> #######运行结果本身没有缩进#########
test.xml
对xml的部分操作:
import xml.etree.cElementTree as ET
tree = ET.parse('test.xml') # 解析文件
root = tree.getroot() # 遍历节点
print(root.tag) # x.tag 获取根节点名字 # 遍历所有的内容
for child in root:
print(child.tag, child.attrib) # 打印节点,属性
for i in child:
print('--->', i.tag, i.text) # 打印节点,节点里的值(内容) # # 取一个节点的值
# for node in root.iter('work'): # 遍历单独某一个节点里的值(过滤year值)
# print(node.tag, node.text)
#
# # 修改(更新)一个某个节点(某个值)
# for node in root.iter('age'):
# new_age = int(node.text) + 1 # 新的年份 +1
# node.text = str(new_age)
# node.set('感叹:', '老了!') # 设置(添加)属性
# # tree.write('xmltext.xml', encoding='utf-8',xml_declaration=True) # 更新文件 # 删除某一个节点 # for uncle in root.findall('uncle'): # findall() 把所有的uncle找到
# age = int(uncle.find('age')) # 找到age下的内容转换为int类型
# if age > 44:
# root.remove(uncle) # 如果满足条件的节点则删除
# tree.write('xtext.xml', encoding='utf-8', xml_declaration=True)
部分方法
另:
除ElementTree(元素树)解析方法外,还有 SAX(simple API for xml), DOM(Document Object Model),Expat 解析xml
参考笔记:https://www.cnblogs.com/yyds/p/6627208.html
Python_xml的更多相关文章
- Python_XML的三种解析方法
什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这 ...
随机推荐
- Qt 出现“undefined reference to `vtable for”
在QT中定义了一个线程类,继承自QThread, 在类中未加 Q_OBJECT 时编译正常,加入后报错如下: undefined reference to `vtable for myThread' ...
- C# 对话框使用整理
1.保存文件对话框 SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Title = "save file"; sa ...
- C和C++相互调用
在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题.近来在主程序是C语言,而调用C++功能函数的时候,C++的*.h头文件都能找到,功能函数也都定义了,最重要 ...
- Fragment与Acitvity通信
Fragment与Activity通信的方式如下: 一.通过初始化函数提供 1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为F ...
- Laravel 5.2响应--后台back()->with('提示信息'),前台为什么收不到?
### 今天遇到了个小问题,想后台判断数据的时候,返回前台,然后弹窗提示没有数据 但是前台点了有返回,咩有提示信息 ### 网上找了很9⃣️,关于这方面的都是属于验证时候的相关问题,但是我这个跟验证没 ...
- 5分钟搞定Nginx安装
1. 安装gcc(centos 7之后一般已自带,可以在第6步失败后再安装) yum install gcc gcc-c++ 2. 安装pcre yum install -y pcre pcr ...
- centos6.5安装python2.7、pip、numpy、scipy
1..安装Development Tools yum groupinstall -y 'development tools' 2.安装SSL.bz2.zlib来为Python的安装做好准备工作 yum ...
- 数据结构HashMap(Android SparseArray 和ArrayMap)
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- Linux下Oracle 12c的卸载
注:本文来源于:<Linux下Oracle 12c的卸载> 与Windows下Oracle的安装容易卸载麻烦相反,Linux下Oracle的安装麻烦下载简单. 1.关闭Oracle数据库 ...
- Windows 批处理大全(附各种实例)
Windows 批处理大全(附各种实例) 2009年07月19日 21:31:00 阅读数:2552 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命 ...