Python-xml基础-学习日志-CSDN21天学习挑战赛(五)-更多学习请期待下期


目录

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矢量克罗斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值