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

news/2024/7/5 7:09:35


目录

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>


http://www.niftyadmin.cn/n/1898062.html

相关文章

从键盘录入几个数,求取最大值?

首先声明一个方法名compare1的方法(也可以直接在main函数中执行&#xff09; public static void compare1() {/*** 从键盘录入几个数&#xff0c;求取最大值*/System.out.println("从键盘录入5个数&#xff1a;");Scanner sc new Scanner(System.in);int arr[] ne…

谈谈像素以及微信小程序的 rpx

欢迎来我的博客阅读&#xff1a;「谈谈像素以及微信小程序的 rpx」前言 最近在负责有赞的某个业务的微信小程序开发&#xff0c;这是我第一次着手微信小程序的开发&#xff0c;这个过程中发现微信小程序所定义的一套 WXSS (WeiXin Style Sheets) 中有一个有趣的长度单位 rpx&am…

Linux入门学习日志(一)

目录 一、vim编辑器 1.创建/进入文件 2.三种模式(附上常用命令) a.一般模式 b.编辑模式 c.两种命令模式&#xff1a;编译模式 “:” 二、关机操作 目标&#xff1a;国庆七天速入Liunx基础&#xff01; 一、vim编辑器 1.创建/进入文件 如果文件不存在&#xff0c;创建新文…

福大软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)

写在前面 林燊大哥一路走来&#xff0c;好不容易&#xff0c;终于完结了。设想和目标 1. 我们的软件要解决什么问题&#xff1f;是否定义得很清楚&#xff1f;是否对典型用户和典型场景有清晰的描述&#xff1f; 解决的问题 用户在进店之前无法得知店铺的优劣&#xff0c;通过现…

【若依框架学习】day1-启动项目

若依开源框架&#xff0c;前后端分离项目&#xff0c;地址&#xff1a;http://doc.ruoyi.vip/ruoyi-vue/ 先配置环境 JDK1.8&#xff0c; MySQL5.7 &#xff0c;Maven3.6&#xff0c;redis、nginx(可以不配)、 node 具体见&#xff1a;https://ygstriver.blog.csdn.net/articl…

JQuery使用方法及案例解析

Jquery能做什么 访问和操作DOM元素 控制页面样式 对页面事件进行处理 与Ajax技术完美结合 设置 动态效果 获取页面元素 无需刷新页面获得服务器信息 简化常见的javasrcipt任务 Jquery的优势体积小&#xff0c;压缩后只有100KB左右 l强大的选择器出色的DOM封装 可靠的事…

swift 学习- 10 -- 类和结构体

// 类和结构体 是人们构建代码所使用的一种通用且灵活的构造体, 我们可以使用完全相同的语法规则来为 类和结构体 定义属性 (变量 和 常量) 和添加方法, 从而扩展 类和结构体 的功能 // 与其他编程语言不同的是, Swift 并不要求你为自定义 类和结构去创建独立的接口和实现文件.…

Linux入门学习日志(二)

目录 零、学前相关基础命令提示/Linux版本 一、用户管理 1.用户组增删 2.用户增删换组 3.查找用户或组相关信息 a.id查询&#xff08;单个查询&#xff09;&#xff1a; b.批量查询&#xff1a; 4.用户模式与特权模式切换 a.普通用户切换到root用户 b.root用户切换到其他…