标签:
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,SAX,DOM,以及ElementTree:
ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)
解析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)
from xml.etree import ElementTree as ET #直接解析xml文件 tree = ET.parse(‘test.xml‘) # 获取xml文件的根节点 root = tree.getroot()
ElementTree常用的方法:
属性
针对属性的操作
针对后代的操作
打印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
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文件方式 使用write()方法可直接保存 tree.write("new.xml", encoding=‘utf-8‘) #解析字符串方式,需将当前root转换为 tree = ET.ElementTree(root) tree.write("new.xml", encoding=‘utf-8‘)
from xml.etree import ElementTree as ET #创建节点 root = ET.Element("father") #创建一个root根节点 child1 = ET.Element(‘child1‘,tag=‘大儿子‘ ,attrib={‘name‘:‘儿子1‘,‘年龄‘:‘22‘}) #创建一个child1节点 child2 = ET.Element(‘child2‘,tag=‘小儿子‘ ,attrib={‘name‘:‘儿子2‘,‘年龄‘:‘10‘}) #创建一个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)
from xml.etree import ElementTree as ET root = ET.Element("father") child1 = root.makeelement(‘child1‘,{‘name‘:‘儿子1‘,‘年龄‘:‘22‘}) child2 = root.makeelement(‘child2‘,{‘name‘:‘儿子2‘,‘年龄‘:‘10‘}) 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)
from xml.etree import ElementTree as ET # 创建根节点 root = ET.Element("father") # 创建大儿子 child1 = ET.SubElement(root, " 大儿子", attrib={‘name‘:‘儿子1‘,‘年龄‘:‘22‘}) # 创建小儿子 child2 = ET.SubElement(root, "小儿子", attrib={‘name‘:‘儿子1‘,‘年龄‘:‘22‘}) # 在大儿子中创建一个孙子 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)
创建的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‘,‘年龄‘:‘22‘}) child2 = root.makeelement(‘child2‘,{‘name‘:‘儿子2‘,‘年龄‘:‘10‘}) 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" 年龄="22"> <grandson1/> </child1> <child2 name="儿子2" 年龄="10"> <grandson2/> </child2> </father>
标签:
原文地址:http://www.cnblogs.com/pycode/p/xml.html