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
xml的特性
- 标签是以一个<字符开头,上面例子中的<data>一样
- 标签的结束是在跟了一段其他内容之后来结束标签用‘/’,例如上面中以<data>***</data>
- 标签之间可以多级嵌套,例如country 就是他的子标签,rank又是country的子标签
- 属性也就是上面中name就是country的属性
- 标签中可以包含值 例如year中的值就是2023
- 如果命名一个标签没有内容或者子标签 它会在右面的尖括号中添加斜杠,例如添加<age/>代表<age></age>是一样的
1、解析XML
#XML解析一
from xml.etree import ElementTree as ET
str_net=open('newnew.xml','r').read()
# 打开文件,读取XML内容
root=ET.XML(str_net)
# 将字符串解析乘xml特殊对象,root代指xml文件的根节点
print(root)
#xml解析二
from xml.etree import ElementTree as ET
tree=ET.parse('newnew.xml') ##直接解析成xml文件
root=tree.getroot() ##获取xml的根节点
print(root.tag) ##顶层标签
for node in root:
print(node.tag,node.attrib)
###第二次节点的标签名称和标签属性
for i in node:
print(i)
###循环获取下一层标签名称和内容
2、操作XML
当前节点的标签名 tag = None """The element's name.""" 当前节点的属性 attrib = None """Dictionary of the element's attributes.""" 当前节点的内容 text = None def makeelement(self, tag, attrib): 创建一个新节点 ef append(self, subelement): 为当前节点追加一个子节点 def extend(self, elements): 为当前节点扩展 n 个子节点 def insert(self, index, subelement): 在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置 def remove(self, subelement): 在当前节点在子节点中删除某个节点 """Remove matching subelement. def find(self, path, namespaces=None): 获取第一个寻找到的子节点 """Find first matching element by tag name or path. def findall(self, path, namespaces=None): 获取所有的子节点 """Find all matching subelements by tag name or path. def iterfind(self, path, namespaces=None): 获取所有指定的节点,并创建一个迭代器(可以被for循环) def clear(self): 清空节点 """Reset element. def get(self, key, default=None): 获取当前节点的属性值 def set(self, key, value): 为当前节点设置属性值 def keys(self): 获取当前节点的所有属性的 key def items(self): 获取当前节点的所有属性值,每个属性都是一个键值对 """Get element attributes as a sequence. def iter(self, tag=None): 在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。 def itertext(self): 在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。
3.遍历xml文档的所有内容
from xml.etree import ElementTree as ET tree=ET.parse('newnew.xml') ##直接解析成xml文件 root=tree.getroot() ##获取xml的根节点 print(root.tag) ##顶层标签 for node in root.iter('year'): print(node.tag,node.text) ###获取所有标签名称和值
4.修改节点内容
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。
from xml.etree import ElementTree as TE
rat=TE.parse('newnew.xml')###直接解析XML文件
print(rat.getroot()) ###找到他的头文件
for i in rat.iter('year'): ##循环找到他的‘year’的值
kat=int(i.text)+1 ###转成整形,每次执行加1
i.text=str(kat) ###转成字符串形式放入
print(i.text) ###查看值
i.set('kk','oo') ###set是添加属性
del i.attrib['kk'] ###del删除属性
rat.write('newnew.xml') ###写入文件
5,删除节点
from xml.etree import ElementTree as ET
############ 解析字符串方式打开 ############
# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read()
# 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)
############ 操作 ############
# 顶层标签
print(root.tag)
# 遍历data下的所有country节点
for country in root.findall('country'):
# 获取每一个country节点下rank节点的内容
rank = int(country.find('rank').text)
if rank > 50:
# 删除指定country节点
root.remove(country)
############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')
创建xml文档
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(son1)
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False
第二种方式
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 = root.makeelement('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(son1)
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
第三种方式
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)
由于原生保存的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.Element('son', {'name': '儿1'})
son1 = root.makeelement('son', {'name': '儿1'})
# 创建小儿子
# son2 = ET.Element('son', {"name": '儿2'})
son2 = root.makeelement('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(son1)
raw_str = prettify(root)
f = open("xxxoo.xml",'w',encoding='utf-8')
f.write(raw_str)
f.close()
浙公网安备 33010602011771号