模块 XML 的特点和用法
一,简介
xml 是实现不同语言或程序之间进行数据交换的协议,跟 json 差不多,但 json 使用起来更简单,不过,古时候,在 json 还没诞生的黑暗年代,大家只能选择用 xml 呀,至今很多传统公司如金融行业的很多系统的接口还主要是 xml.
二,特点
xml 的格式如下,就是通过 <> 节点来区别数据结构的:
<duoduo>#这里面的内容可以换
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country> #观察可以发现实际上和字典的特性差不多
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</duoduo>
三,XML 的用法
xml 协议在各个语言里的都 是支持的,在 python 中可以用以下模块操作 xml 1,查询 xml 文档内容
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root) #获取根节点,也就是内存地址
print(root.tag) #根的名字
# 遍历xml文档
for country in root:
print(country.tag, country.attrib) #分别打印子节点名称和子节点属性
for i in country: #遍历子节点下的所有节点
print(i.tag, i.text,i.attrib) #打印子节点下节点的节点名,节点值,节点值的属性
# 只遍历year节点
for i in country.iter("year"):
print("\t", i.tag, i.attrib, i.text)
# 只遍历year 节点
for node in root.iter('year'):
print(node.tag, node.text) #打印year的节点名和节点值
重点: 1,tag 是返回节点名,attrib 返回节点属性,text 返回节点值 2,返回根节点用 getroot() 方法 3,只遍历某个节点,只需要用 iter(节点名) 方法 4,遍历找不到要找的只能继续往下遍历 2,修改 xml 文档内容
import xml.etree.ElementTree as et
tree = et.parse("xmltest.xml")
root = tree.getroot()
#修改year节点的值
for node in root.iter("year"):
new_year = int(node.text) + 1 #修改节点值
node.text = str(new_year) #修改后强制转换成字符串类型
node.tag = "newyear" #修改节点名
node.set("duoduo",'2018') #修改节点属性
tree.write("xmltest1.xml") #修改完成后,重新写入xml文件(可以是任何文件,包括原来的)
重点:
可以修改 xml 文件中的任何内容,包括本身的节点名,修改后一定要有写入 xml 文件的操作.
3,删除 xml 文档内容
import xml.etree.ElementTree as et
tree = et.parse("xmltest.xml")
root = tree.getroot()
#删除
for country in root.findall("country"): #找到第一层子节点("具体对象")
rank = int(country.find("rank").text) #找到子节点下的("rank")节点的节点值
if rank > 50:
root.remove(country) #删除子节点
tree.write("xmltest1.xml") #重新写入xml文件
重点:
1,root.findall() 从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址, 前面 root 定义什么区域,就查找什么区域
2,删除子节点用 remove() 方法 3,删除以后,一定要做重新写入新的 xml 文件操作
4,创建新的 xml 文件
import xml.etree.ElementTree as et
new_xml = et.Element("namelist") #创建根节点
#创建第一层子节点,后面参数依次是:父节点,子节点,子节点属性
name = et.SubElement(new_xml,"name",attrib={"duoduo":"handsome")
#创建第二层子节点
age = et.SubElement(name,"age",attrib={"check":"yes")
#设置第二层节点值
age.text = '22'
sex = et.SubElement(name,"sex")
sex.text = "man"
#创建另外一个第一层子节点
name2 = et.SubElement(new_xml,"name",attrib={"qianduoduo":"haoshuai")
#创建其第二层子节点
age = et.SubElement(name2,"age")
age.text = '19'
ET = et.ElementTree(new_xml) #生成新的xml文档
ET.write("test.xml",encoding="utf-8",xml_declaration=True) #在新xml文件的开头自动添加:<?xml version='1.0' encoding='utf-8'?>
et.dump(new_xml) #在屏幕上打印生成的格式
重点:pycharm 创建的 xml 直接就是一行,没有格式.
来源: https://www.cnblogs.com/ManyQian/p/8343518.html