目录
XML简单学习与使用
一、xml概述
1.概念:
2.功能特点:
二、xml文档格式
1.首行声明:
2.完整xml文件如下:
三、Python解析xml文件
1.ElementTree方式
2.DOM方式
四、Python的xml相关操作
1.Python写入xml
2.Python更新(插入)xml
3.xml转json
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
XML简单学习与使用
一、xml概述
1.概念:
XML 指可扩展标记语言(eXtensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。
2.功能特点:
XML 和 HTML 为不同的目的而设计:
- XML 被设计用来传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
说人话,这是用来存东西的盒子。
特点作用语法简述:
# 0.标签自定义,配置、传输文件数据,存储数据。
# 1. ".xml"为文件后缀
# 2.首行声明,根标签只有一个。
# 3.所有标签得正确关闭、区分大小写。
# 4.标签名称不能以数字、标点符号和xml开始,不能包含空格
# (语法与HTML相似)
二、xml文档格式
1.首行声明:
分为三部分,如下所示:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--xml :声明 version:版本号 encoding:编码格式 standalone:表示独立使用,默认为no-->
2.完整xml文件如下:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--xml :声明 version:版本号 encoding:编码格式 standalone:表示独立使用,默认为no-->
<root name="战队化">
<!--root是根标签,其它被root包含的标签都是子标签-->
<school name="部署初始化" >
<!--ID和name都是节点属性-->
杀第力<!-- 这个是标签内容(特指标签中间的文本元素)-->
<name>xiaoloin</name>
<age>41</age>
<city>hainan</city>
<sex>boy</sex>
</school>
<school name="部署一">
百人王
<name>王之柱</name>
<age>20</age>
<city>广西</city>
<sex>男</sex>
<line name="bug">
pading
</line>
</school>
<school name="部署二">
无上之邸
<name>白帝</name>
<age>20</age>
<city>广东</city>
<sex>男</sex>
</school>
</root>
三、Python解析xml文件
这里引用上面的xml做如下测试
1.ElementTree方式
tree0 = ET.ElementTree(file='banding.xml') # 加载文档
a = tree0.getroot() # 获取根元素对象
print(a)
print(a.tag) # 获取根标签名
print(a.attrib) # 获取根根标签的属性,以字典形式返回
for i in a:
print(i.tag,i.attrib)
# 遍历子元素(标签)(一级)
# 获取根元素对象下的每一个元素的每一个标签名和标签属性
print('****'*15)
print(a[1].tag,a[1].attrib) # 特定索引值访问子元素
print('----')
# 深度遍历:
# 1.全遍历--遍历某个元素之下的所有子元素
for i in a.iter():
print(i.tag,i.attrib,i.text)
# 2.定向遍历
print('-----')
for i in a.iter(tag='name'):
print(i.tag,i.text)
print('-----')
# 3.路径式遍历查找(XPath)
for i in a.iterfind('school/name'):
print(i.tag,i.text)
print('----')
# 4.查找具备某个name属性具备特定属性值的标签,name元素
for i in a.iterfind('school[@name="部署一"]'):
print(i.tag, i.text)
print('------')
2.DOM方式
# coding=gbk
from xml.dom.minidom import parse
# 读取文件
word_text = parse('banding.xml')
# 获取文档元素对象
elem = word_text.documentElement
# 获取 school
school_list_obj = elem.getElementsByTagName('school')
print(school_list_obj)
print(type(school_list_obj))
print("*-"*20)
for school_element in school_list_obj:
# 获取school标签中的内容
age = school_element.getElementsByTagName('age')[0].childNodes[0].nodeValue
city = school_element.getElementsByTagName('city')[0].childNodes[0].nodeValue
sex = school_element.getElementsByTagName('sex')[0].childNodes[0].nodeValue
print('age:', age, ', city:',city, ', sex:', sex)
输出内容为:
[<DOM Element: school at 0x14ae638e440>, <DOM Element: school at 0x14ae63a53f0>, <DOM Element: school at 0x14ae63a5750>]
<class 'xml.dom.minicompat.NodeList'>
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
age: 41 , city: hainan , sex: boy
age: 20 , city: 广西 , sex: 男
age: 20 , city: 广东 , sex: 男
四、Python的xml相关操作
1.Python写入xml
# coding=gbk
# 这是避免程序故障的字段,没什么故障的话直接忽略即可
import xml.dom.minidom
# 1、创建空文档
text_0 = xml.dom.minidom.Document()
# 2、创建根元素并设置属性,再写入文档
stack = text_0.createElement('countries ')
stack.setAttribute('library', 'beijin')
text_0.appendChild(stack)
# 3、创建子元素并设置属性
map = text_0.createElement('map')
map.setAttribute('国家', '中国')
# 4、添加注释
stack.appendChild(text_0.createComment('这是根元素注释'))
map.appendChild(text_0.createComment('这是子元素注释'))
# 5、设置子元素中的子元素(嵌套)
regin0 = text_0.createElement('address')
regin0.appendChild(text_0.createTextNode('地处亚洲东部'))
capital = text_0.createElement('首都')
capital.appendChild(text_0.createTextNode('北京'))
population = text_0.createElement('人口')
population.appendChild(text_0.createTextNode('4亿'))
# 6、将子元素逐一加入节点中
map.appendChild(regin0)
map.appendChild(capital)
map.appendChild(population)
# 7、添加第二个map节点
stack.appendChild(map)
# 创建子元素map+设置属性
map = text_0.createElement('map')
map.setAttribute('国家', '美国')
# 子元素的子元素添加与设置
regin0 = text_0.createElement('address')
regin0.appendChild(text_0.createTextNode('北美中部'))
capital = text_0.createElement('首都')
capital.appendChild(text_0.createTextNode('纽约'))
population = text_0.createElement('人口')
population.appendChild(text_0.createTextNode('1亿'))
# 写入map节点后再将map加入根节点中
map.appendChild(regin0)
map.appendChild(capital)
map.appendChild(population)
stack.appendChild(map)
# 输出写完的全部xml
print(stack.toxml())
# 创建并写入文件当中,编码必须指定utf-8格式(有中文,推荐调整为utf-8)(默认16进制)
with open('./世界地图范本.xml', 'w', encoding='utf-8') as book:
text_0.writexml(book, indent='', addindent='\t', newl='\n', encoding='utf-8')
编译器输出结果为:
C:\Users\14317\AppData\Local\Programs\Python\Python310\python.exe E:/Study/python/Knowlage-CSDN/XML/xml写入.py
<countries library="beijin"><!--这是根元素注释--><map 国家="中国"><!--这是子元素注释--><address>地处亚洲东部</address><首都>北京</首都><人口>4亿</人口></map><map 国家="美国"><address>北美中部</address><首都>纽约</首都><人口>1亿</人口></map></countries >
进程已结束,退出代码0
输出后xml文件内容为:
<?xml version="1.0" encoding="utf-8"?>
<countries library="beijin">
<!--这是根元素注释-->
<map 国家="中国">
<!--这是子元素注释-->
<address>地处亚洲东部</address>
<首都>北京</首都>
<人口>4亿</人口>
</map>
<map 国家="美国">
<address>北美中部</address>
<首都>纽约</首都>
<人口>1亿</人口>
</map>
</countries >
2.Python更新(插入)xml
#coding=gbk
import xml.dom.minidom
from xml.dom.minidom import parse
# 文件路径
path_1 = './世界地图范本.xml'
# 拿到根节点
stack_Tree = parse(path_1)
stack_Node = stack_Tree.documentElement
# 建立空的文档(相当于中转站,起到暂存的作用)
text_1 = xml.dom.minidom.Document()
# 新建一个map()
map = text_1.createElement('map')
map.setAttribute('国家', '俄罗斯')
# map下的子元素的创建
address = text_1.createElement('address')
address.appendChild(text_1.createTextNode('亚洲上面'))
capital = text_1.createElement('首都')
capital.appendChild(text_1.createTextNode('莫斯科'))
population = text_1.createElement('人口')
population.appendChild(text_1.createTextNode('3亿'))
# 加入map节点
map.appendChild(address)
map.appendChild(capital)
map.appendChild(population)
# 获取文档中刚刚创建好的map
math_map = stack_Node.getElementsByTagName('map')[0]
# insertBefore方法 父节点.insertBefore(新节点,父节点中的子节点)
stack_Node.insertBefore(map, math_map)
# 在最后插入新建的map
stack_Node.appendChild(map)
print(stack_Node.toxml())
with open(path_1, 'w', encoding='utf-8') as fh:
stack_Tree.writexml(fh, indent='', addindent='\t', newl='', encoding='utf-8')
插入后上面的“世界地图范本.xml”文件内容将变成:
<?xml version="1.0" encoding="utf-8"?><countries library="beijin">
<!--这是根元素注释-->
<map 国家="中国">
<!--这是子元素注释-->
<address>地处亚洲东部</address>
<首都>北京</首都>
<人口>4亿</人口>
</map>
<map 国家="美国">
<address>北美中部</address>
<首都>纽约</首都>
<人口>1亿</人口>
</map>
<map 国家="俄罗斯"> <address>亚洲上面</address> <首都>莫斯科</首都> <人口>3亿</人口> </map></countries>
3.xml转json
xml文件内容如下:
<school classname="汕职院">
<student name="01">Java哥</student>
<student name="02">C哥</student>
<student name="03">Python哥</student>
</school>
python上的xml转json简易代码:
#coding:gbk
import json
import xmltodict
XML_PATH = 'xml转json.xml' # xml文件的路径
# 阅读模式打开文件
with open(XML_PATH, 'r',encoding="utf-8") as f:
# 创建新的json文件
with open(XML_PATH[:-3] + 'json', 'w',encoding="utf-8") as newfile:
# xml解析器,写入从xml文件上读出来的文件内容
xml_json_c = xmltodict.parse(f.read())
# json.dumps将解析出来的xml_json_c转为json格式并写入新文件中。
newfile.write(json.dumps(xml_json_c, indent=10))
输出后的json文件内容:
{
"school": {
"@classname": "\u6c55\u804c\u9662",
"student": [
{
"@name": "01",
"#text": "Java\u54e5"
},
{
"@name": "02",
"#text": "C\u54e5"
},
{
"@name": "03",
"#text": "Python\u54e5"
}
]
}
}
6.json转xml
初始化的json文件如下:
{
"Student01":{
"name": "SYW",
"major": "computer",
"age": "18",
"like": "read book"
},
"Student02": {
"like": "play game",
"age": "20"
},
"Student03": "I don't know."
}
json转xml的Python代码如下:
# coding=gbk
import xmltodict
import json
JX_path = 'JSON_XML.json' # json文件的路径
JW = ''
with open(JX_path, 'r',encoding="utf-8") as f:
# 将json转换为Python字典
dict0 = json.loads(f.read())
with open(JX_path[:-4] + 'xml', 'w',encoding="utf-8") as new_file:
# 将字典转换为xml文件格式后写入新xml文件
new_file.write(xmltodict.unparse(dict0))
xml文件输出后如下:
<?xml version="1.0" encoding="utf-8"?>
<School><Student01><name>SYW</name><major>computer</major><age>18</age><like>read book</like></Student01><Student02><like>play game</like><age>20</age></Student02><Student03>I don't know.</Student03></School>
<!--为了美观,格式化一下,变成下面的样子:-->
<School>
<Student01>
<name>SYW</name>
<major>computer</major>
<age>18</age>
<like>read book</like>
</Student01>
<Student02>
<like>play game</like>
<age>20</age>
</Student02>
<Student03>I don't know.</Student03>
</School>