xml解析模块
XML
XML是可扩展标记语言的缩写,是实现不同语言或程序之间进行数据交换的协议,主要可以对key添加属性. 页面做展示(字符类型的一个xml格式数据)\做配置文件(内部xml格式的数据).,每一个节点都是一个element对象
格式:
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2026</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
python解析xml
python有三种方法解析XML,SAX,DOM,以及ElementTree:
- SAX (simple API for XML ) python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
- DOM(Document Object Model) 将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)使用elementtree解析xml
- 测试文件:
War, Thriller
DVD
2003
PG
10
Talk about a US-Japan warAnime, Science Fiction
DVD
1989
R
8
A schientific fictionAnime, Action
DVD
4
PG
10
Vash the Stampede!Comedy
VHS
PG
2
Viewable boredom```
- 测试文件:
解析xml
- 使用ElementTree.XML将字符串解析为xml对象
from xml.etree import ElementTree as ET # 打开文件,读取XML内容
xml_str = open('test.xml','r',encoding='utf-8').read() 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(xml_str)- 使用ElementTree.parse将文件直接解析问xml对象
from xml.etree import ElementTree as ET #直接解析xml文件
tree = ET.parse('test.xml')
# 获取xml文件的根节点
root = tree.getroot()ElementTree常用的方法:
属性
- tag:string,元素代表的数据种类。
- text:string,元素的内容。
- tail:string,元素的尾形。
- attrib:dictionary,元素的属性字典。
针对属性的操作
- clear():清空元素的后代、属性、text和tail也设置为None。
- get(key, default=None):获取key对应的属性值,如该属性不存在则返回default值。
- items():根据属性字典返回一个列表,列表元素为(key, value)。
- keys():返回包含所有元素属性键的列表。
- set(key, value):设置新的属性键与值。
针对后代的操作
- append(subelement):添加直系子元素。
- extend(subelements):增加一串元素对象作为子元素。#python2.7新特性
- find(match):寻找第一个匹配子元素,匹配对象可以为tag或path。
- findall(match):寻找所有匹配子元素,匹配对象可以为tag或path。
- findtext(match):寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
- insert(index, element):在指定位置插入子元素。
- iter(tag=None):生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
- iterfind(match):根据tag或path查找所有的后代。
- itertext():遍历所有后代并返回text值。
- remove(subelement):删除子元素。
- getroot():获取根节点.
打印xml信息
from xml.etree import ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
print(root.tag) #打印根标签
for i in root:
print(i.tag,i.attrib) #打印第二层节点的标签名称和属性
for i in root.iter('format'): #循环打印所有format的标签,并打印名字和内容
print(i.tag,i.text)
输出结果:
collection
movie {'title': 'Enemy Behind'}
movie {'title': 'Transformers'}
movie {'title': 'Trigun'}
movie {'title': 'Ishtar'}
format DVD
format DVD
format DVD
format VHS
- 修改xml内容
from xml.etree import ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
for i in root.iter('year'): #循环所有的year ,然后修改 值,并添加属性
new_year = int(i.text) + 10
node.txt = str(new_year)
i.set('test','testadd') #添加属性 test 值为testadd
- 保存xml
#解析xml文件方式 使用write()方法可直接保存
tree.write("new.xml", encoding='utf-8') #解析字符串方式,需将当前root转换为
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')
- 创建xml文件
from xml.etree import ElementTree as ET #创建节点
root = ET.Element("father") #创建一个root根节点
child1 = ET.Element('child1',tag='大儿子' ,attrib={'name':'儿子1','年龄':''})
#创建一个child1节点
child2 = ET.Element('child2',tag='小儿子' ,attrib={'name':'儿子2','年龄':''})
#创建一个child2街店 grandson1 = ET.Element('grandson1') #创建一个grandson1节点
grandson2 = ET.Element('grandson2') #创建一个grandson2节点 #节点逻辑堆加
child1.append(grandson1) #把grandson1加入到child1的下,成为其子节点
child2.append(grandson2) root.append(child1)
root.append(child2) #保存xml到文件
tree = ET.ElementTree(root)
tree.write('xxoo.xml',encoding='utf-8', short_empty_elements=False)
方法1
from xml.etree import ElementTree as ET
root = ET.Element("father")
child1 = root.makeelement('child1',{'name':'儿子1','年龄':''})
child2 = root.makeelement('child2',{'name':'儿子2','年龄':''})
grandson1 = child1.makeelement('grandson1',{})
grandson2 = child2.makeelement('grandson2',{})
#节点逻辑堆加
child1.append(grandson1) #把grandson1加入到child1的下,成为其子节点
child2.append(grandson2)
root.append(child1)
root.append(child2)
#保存xml到文件
tree = ET.ElementTree(root)
tree.write('xxoo.xml',encoding='utf-8', short_empty_elements=False)
方法2
from xml.etree import ElementTree as ET # 创建根节点
root = ET.Element("father") # 创建大儿子
child1 = ET.SubElement(root, " 大儿子", attrib={'name':'儿子1','年龄':''})
# 创建小儿子
child2 = ET.SubElement(root, "小儿子", attrib={'name':'儿子1','年龄':''}) # 在大儿子中创建一个孙子
grandson1 = ET.SubElement(child1,"grandson1")
grandson2 = ET.SubElement(child2,"grandson2") et = ET.ElementTree(root) #生成文档对象
et.write("xxoo.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
方法3
创建的xml文档:
<father><child1 name="儿子1" 年龄="22"><grandson1></grandson1></child1><child2 name="儿子2" 年龄="10"><grandson2></grandson2></child2></father>
由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:
from xml.etree import ElementTree as ET
from xml.dom import minidom def prettify(elem):
"""将节点转换成字符串,并添加缩进。
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t") root = ET.Element("father") child1 = root.makeelement('child1',{'name':'儿子1','年龄':''})
child2 = root.makeelement('child2',{'name':'儿子2','年龄':''}) grandson1 = child1.makeelement('grandson1',{})
grandson2 = child2.makeelement('grandson2',{}) child1.append(grandson1)
child2.append(grandson2) root.append(child1)
root.append(child2) #tree = ET.ElementTree(root)
#tree.write('xxoo.html',encoding='utf-8', short_empty_elements=False)
raw_str = prettify(root) f = open("xxoo.xml",'w',encoding='utf-8')
f.write(raw_str)
f.close()
效果:
<?xml version="1.0" ?>
<father>
<child1 name="儿子1" 年龄="">
<grandson1/>
</child1>
<child2 name="儿子2" 年龄="">
<grandson2/>
</child2>
</father>
xml解析模块的更多相关文章
- 第四十一节,xml处理模块
XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下 读xml文件 <data> <country name="Liechtenstein"> ...
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- python的内置模块xml模块方法 xml解析 详解以及使用
一.XML介绍 xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml xml跟html都属于是标签语言 我们主要学 ...
- Python 爬虫笔记、多线程、xml解析、基础笔记(不定时更新)
1 Python学习网址:http://www.runoob.com/python/python-multithreading.html
- 使用NodeJS将XML解析成JSON及性能比较
并不是所有的API都是以JSON格式返回的.我们有时侯不得不处理一些XML.幸运的是有一个NodeJS模块 xml2js 可以帮你做这件事. 比如,我们要处理下面这段XML <?xml ...
- Java数据库编程、XML解析技术
数据库编程 JDBC概述 是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力. 是一种用于执行SQL语句的Java API,可以为多种关系数据库 ...
- 【Python】xml 解析
1. XML:指可扩展标记语言,是一种标记语言,用于存储数据和传输数据,但没有像HTML那样具有预定义标签,需要程序猿自定义标签 2. XML的解析:读取XML数据结构中的某些信息,比如读取书的属性 ...
- python的XML处理模块ElementTree
ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型.它在Python2.5以后成为Python标准库的一部分,但是Python2.4之前需要单独安装.在使用Elemen ...
- glib简单记录包括字符串,主循环,回调函数和xml解析
一.将最近用到的glib字符串功能整理了下直接用程序记录比较好看懂 #define MAX_LEN 100gchar * demo (char* msg, ...){ gchar * pcfgf ...
随机推荐
- 学习C++.Primer.Plus 6 分支语句和逻辑操作符
||. &&操作符是一个顺序点 < 操作符从左向右结合 ; < age < )//17<age为true, = 1,肯定 < 27.所以为整个条件为tru ...
- 细细品味Storm_Storm简介及安装
Storm是由专业数据分析公司BackType开发的一个分布式实时数据处理软件,可以简单.高效.可靠地处理大量的数据流.Twitter在2011年7月收购该公司,并于2011年9月底正式将Storm项 ...
- 分析cocos2d-x中的CrystalCraze示例游戏
cocos2d-x自带了不少示例,以及几个比较简单的游戏,不过这些游戏都是用javascript binding(SpiderMonkey)做的,所以我猜测javascript binding可能是c ...
- FineUI小技巧(4)关闭窗体那些事
前言 FineUI中的Window控件常用作选择.新增或编辑内容.而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发. 如何关闭Window控件 第一个问题就是如何关闭Window控 ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- 吉特仓库管理系统-.NET4.0环境安装不上问题解决
在给客户实施软件的过程中要,要安装.NET 4.0 环境,而且是在XP的系统上. 目前的客户中仍然有大量使用XP的机器,而且极为不稳定,在安装吉特仓库管理系统客户端的时候出现了如下问题: 产品: Mi ...
- Sql 2012 远程数据库连接
新装好的数据库,各种远程连接设置都设置好后.发现还是连接不上. 这时候,问题可能出在端口上,远程连接的时候需要指明端口.动态端口一般都会变.在本机连接时候,会自动选择端口.在远程访问时候,就必须要指明 ...
- 数据契约(DataContract)及序列化指定输出字段
服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...
- Google 面试
坚持完成这套学习手册,你就可以去 Google 面试了 系统 指针 value Google 面试 阅读10266 本文为掘金投稿,译文出自:掘金翻译计划 原文地址:Google Intervie ...
- A Regularized Competition Model for Question Diffi culty Estimation in Community Question Answering Services-20160520
1.Information publication:EMNLP 2014 author:Jing Liu(在前一篇sigir基础上,拓展模型的论文) 2.What 衡量CQA中问题的困难程度,提出从两 ...