XML 模块
XML 模块
XML
XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:
<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>
1)、解析XML
@1.利用ElementTree.XML 将字符串解析成xml对象
from xml.etree import ElementTree as ET #打开文件,读取XML内容 str_xml = open('xo.xml','r').read() #打开xo.xml文件给读的权限,并读取 #将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml)
@2.利用ElementTree。parse将文件直接解析成xml对象
from xml.etree import ElementTree as ET #直接解析xml文件 tree = ET.parse("xo.xml") #获取xml文件的根节点 root = tree.getroot()
2)、操作XML
XML 格式类型是节点嵌套节点,对于每一个阶段均有以下功能,以便对当前结点进行操作:
class Element: 当前结点的标签名: tag = None 当前结点的属性 attrib = None 当前结点的内容 text = None def __init__(self, tag, attrib={}, **extra): if not isinstance(attrib, dict): raise TypeError("attrib must be dict, not %s" % ( attrib.__class__.__name__,)) attrib = attrib.copy() attrib.update(extra) self.tag = tag self.attrib = attrib self._children = [] def makeelement(self, tag, attrib): 创建一个新节点 return self.__class__(tag, attrib) def copy(self): ..... def append(self,subelement): 为当前节点追加一个子节点 def extend(self, elements): 为当前子节点扩展n个子节点 def insert(self, index, subelement): 在当前节点的子节点中插入某个节点,即为当前节点创建子节点,然后插入指定位置 def remove(self, subelement): 在当前节点在子节点中删除某个节点 def find(self, path, namespaces=None): 获取第一个寻找到的子节点 def findtext(self, path, default=None, namespaces=None): 获取第一个寻找到的子节点的内容 def findall(self, path, namespaces=None): 获取所有的子节点 def iterfind(self, path, namespaces=None): 获取所有指定的节点,并创建一个迭代器(可以被for循环) def clear(self): 清空节点 def get(self): 获取当前节点的属性值 def set(self, key, value): 为当前节点设置属性值 def keys(sekf): 获取当前节点的所有属性的key def items(self): 获取当前节点的所有属性值,每个属性值都是一个键值对 def iter(self, tag=None): 在当前节点的子孙中根据节点名称寻找所以指定的节点,并返回一个迭代器(可以被for循环) def getiterator(self, tag=None): ..... def itertext(self): 在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)
进行实例操作:
a、遍历XML文档的所有内容
for xml.etree import ElementTree as ET *********解析方式一 ************ """ #打开文件,读取XML内容 str_xml = open('xo.xml','r').read() #将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) """ 由于这样太繁琐,而python有更加简洁的方式 *******解析方式二*************** tree = ET.parse("xo.xml") #直接解析xml文件 root = tree.getroot() #获取xml文件的根节点 ###操作 print(root.tag) #顶层标签 for child in root:#遍历XML文档的第二层 print(child.tag, child.attrib)#第二层节点的标签名称和标签属性 for i in child: # 第二层节点的标签名称和内容 print(i.tag, i.text)
b)、遍历XML中指定的节点
from xml.etree import ElementTree as ET ***********解析方式一********** """ str_xml = open("xo.xml","r").read() #打开文件读取xml内容 root = ET.XML(str_xml) #将字符串解析成xml特殊对象,root代指xml文件的根节点 """ ************解析方式二************ tree = ET.parse("xo.xml") #直接解析xml文件 root = tree.getroot() #获取xml文件的根节点 ###操作 print(root.tag) #顶层标签 for node in root.iter('year'): #遍历XML中所有的year节点 print(node.tag, node.text) #节点的标签名称和内容
c)、修改节点内容
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。
@1、解析字符串方式,修改,保存 from xml.etree import ElementTree as ET *******解析方式一********* 懒的写第一种方式了,困了***针对字符串(需要加上倒数第二句话) ********解析方式二*******针对文件 tree = ET.parse("xo.xml") root = tree.getroot() print(root.tag) #打印顶级标签 for node in root.iter('year'): #循环所有year节点 new_year = int(node.text) + 1 将year节点中 的内容自增1 node.text = str(new_year) #设置属性 node.set('name','alex') node.set('age','18') del node.attrib['name'] #删除属性 ********记得保存文件********** tree = ET.ElementTree(root) #这一句适用于第一种解析方式,因为他的格式是字符串,而第二种方式是ElementTree,所以不在需要转换了,程度:****** tree.write("newnew.xml", encoding="utf-8")
d)、删除节点
from xml.etree import ElementTree as ET **********解析字符串方式打开******** #打开文件,读取XML内容 str_xml = open('xo.xml','r').read() #将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) **********解析文件方式打开********** tree = ET.parse('xo.xml') #直接解析xml文件 root = tree.getroot() #获取解析xml文件 *********操作***************** print(root.tar) #打印顶级标签 for cuntry in root.findall('country'): #遍历data下的所有country节点 rank = int(country.find('rank').txt) #获取每一个country节点下rank节点的内容 if rank > 50: root.remove(country) *********保存文件*********** tree = ET.ElementTree(root) --如果是对字符串操作,就写这句,文件不用 tree.write("newnew.xml", encoding="utf-8")
3、创建XML文档
@1)方法一:
from xml.etree import ElementTree as ET root = ET.Element("famliy") #创建根节点 son1 = ET.Element('son',{"name":'儿1'}) #创建节点大儿子 son2 = ET.Element('son', {"name":'儿2'}) #创建小儿子 在大儿子中创建两个孙子 grandson1 = ET.Element('grandson', {'name':"儿11"}) grandson2 = ET.Element('grandson', {'name': '儿12'}) son1.append(grandson1) son1.append(grandson2) #把两个孙子添加到大儿子中 #把大儿子添加到根节点中 root.append(son1) root.append(son2) tree = ET.ElementTree(root) tree.write('oooo.xml', encoding='utf-8', short_empty_elements=False)
@2)、方法二:
from xml.etree import ElementTree as ET root = ET.element("famliy") 创建大儿子节点 #son1 = ET.Element('son', {"name":"儿1"}) son1 = root.makeelement("son", {"name":"儿1"}) #创建小儿子节点 #son2 = ET.Element('son', {"name":"儿2"}) son2 = ET.makeement('son', {"name":"儿2"}) #在大儿子中创建两个小儿子 #grandson1 = ET.Element('grandson', {'name':'儿11'}) grandson1 = son1.makeelement('grandson', {'name':'儿11'}) #grandson2 = ET.Element('grandson', {"name":"儿12"}) grandson2 = son1.makeelement("grandson", {"name":'儿12'}) son1.append(grandson1) son1.append(grandson2) 把儿子添加到根节点中 root.append(son1) root.append(son2) tree = ET.ElementTree(root) tree.write('oooo.xml', encoding="utf-8", short_empty_element=False)
@3)、方法三:
from xml.etree import ElementTree as ET root = ET.Element("famliy") #创建根节点 创建节点大小儿子 son1 = ET.SubElement(root, "son", attrib={"name":"儿1"}) son2 = ET.SubElement(root, "son", attrib={"name":"儿2"}) 创建大孙子 grandson1 = ET.SubElement(son1, "age", attrib={"name":"儿11"}) grandson1.text = '孙子' et = ET.ElementTree(root) #生成文档对象 et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
@4)、方法4:
由于原生保存的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("famliy") #创建根节点 创建节点大小儿子 son1 = ET.SubElement(root, "son", attrib={"name":"儿1"}) son2 = ET.SubElement(root, "son", attrib={"name":"儿2"}) 创建大孙子 grandson1 = ET.SubElement(son1, "age", attrib={"name":"儿11"}) grandson1.text = '孙子' raw_str = prettify(root) f = open("xxoo.xml", "w", encoding="utf-8") f.write(raw_str) f.close()
@5)、命名空间
网址:http://www.w3school.com.cn/xml/xml_namespaces.asp
from xml.etree import ElementTree as ET ET.register_namespace('com',"http://www.company.com") #some name # build a tree structure root = ET.Element("{http://www.company.com}STUFF") body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"}) body.text = "STUFF EVERYWHERE!" # wrap it in an ElementTree instance, and save as XML tree = ET.ElementTree(root) tree.write("page.xml", xml_declaration=True, encoding='utf-8', method="xml")
作者:沐禹辰
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。