day23
XML与JSON的对比
XML文档格式
使用XML模块解析
什么是XML
全称叫做可扩展标记语言
是一种定义电子文档结构和描述的语言,可以用来标记数据、定义数据类型
用户可以对自己的标记语言进行定义和扩展,由W3C(万维网标准组织)推出,几乎所有的编程语言都支持该格式
标记翻译为标签,标签指的是某种特殊符号,简单的说XML就是用标签来定义文档结构和数据
XML文档格式
来看一个例子:
<person name="jack">hello i am a person</person>
一个完整的标签分为三个部分
标签名(tagname): person
属性(attribute): name 值为jack
文本(text): hello i am a person
属性和文本都是可选的,所以你可以这样来定义一个空标签
<person></person>
其他格式要求:
一、任何的起始标签都必须有一个结束标签。
二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<person/>。XML解析器会将其翻译成<person></person>。
三、标签必须按顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
四、所有的属性都必须有值。
五、所有的属性都必须在值的周围加上双引号。
六、最外层必须有且只能有一个标签,称为根标签
与JSON的对比
json是JavaScript语言的对象表示法,其仅支持js中的数据类型,(虽然大多数情况下是足够使用的),之所以出现是因为在开发中,通常都需要后台向前台传输数据,那自然是要传输前台能看懂的数据格式,json就是这样一种数据格式,可以轻松的被js语言解析,使用场景多为前后台交互
而xml支持的数据类型理论上是不受限制的,因为可以完全自定义标签的结构和含义,使用场景也非常广泛,不局限于前后台的数据交互,在一些语言中还经常作为配置文件来使用
另外,HTML 看起来与XML非常的类似,的确,HTML也属于XML
如果仅仅将XML用做数据交换格式的话,远不如json来的简单,由于出现时间的关系,有很多早期项目都是使用XML来完成的
使用XML模块解析
准备数据
解析XML
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
#遍历xml文档
for child in root:
print('========>',child.tag,child.attrib,child.attrib['name'])
for i in child:
print(i.tag,i.attrib,i.text)
#只遍历year 节点
for node in root.iter('year'):
print(node.tag,node.text)
#---------------------------------------
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
#修改
for node in root.iter('year'):
new_year=int(node.text)+1
node.text=str(new_year)
node.set('updated','yes')
node.set('version','1.0')
tree.write('test.xml')
#删除node
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
1.三个用于查找标签函数
iter("标签名") #全文查找
find("标签名") #查找子节点匹配的第一个
findall("标签名") #查找子节点匹配的所有标签
2.访问标签的内容
element.tag 获取标签名
element.attrib 获取属性
element.text 获取文本
3.修改文档内容
elment.tag = "标签名"
element.text = "文本"
element.set("属性名","属性值")
4.删除节点
root.remove(标签对象)
5.添加子标签
#创建标签对象
year2=ET.Element('year2') # 指定名称
year2.text='新年'
year2.attrib={'update':'yes'}
#添加
country.append(year2) #往country节点下添加子节点
删除添加修改后都需要调用write写入到文件
tree.write("文件名"),#注意文档对象才能执行写入操作
代码生成XML文档(了解)
import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = 'man'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'
et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True)
ET.dump(new_xml) #打印生成的格式
总结,xml的解析比起json而言非常复杂 因为其扩展性远比json高,在java中常作为配置文件,当你在前后台进行数据交互时,优先使用json格式
面向过程
面向过程 核心是过程 过程指的是解决问题步骤,即先干什么再干什么
面向过程就好比一条设计好的流水线 是一种机械的思维的方式
优点:复杂的过程简单化 复杂的问题分成一些小问题一部一部解决
并且我们可以预先知道我们需要得到的结果
缺点:可塑性差 只能解决单一的问题,当需要添加一些新的东西
很难实现 会让程序大改 因为程序一步一步执行的过程必须被打断
所以会造成牵一发而动全身
而面向对象
面向对象 核心是对象 通过指挥对象来帮我们需要完成的某些事
面向对象
类和对象是面向对象中最重要的两个元素
是一种编程思想 通过指挥对象来完成任务 而不是像面向过程一样需要自己一部一部完成工作内容
在现实中是现有的对象 才有的类 而在编程中先有类在有对象
面向对象编程的优点:
-
程序员的角色发送了改变,从一个操作者,变成了指挥者,不再需要关心,每个功能具体的实现细节,从而可以专注处理业务逻辑,是一种思想上的转变
-
大大提高了程序的扩展性,当一个对象发生了修改时,对其他对象时没有任何影响的,对象之间相互独立,耦合度变得更低了
-
提高了程序的灵活性,例如游戏中,每个玩家的操作都是自由的,而不是机械般固定的!你可以买武器,也可以买护甲
缺点:
-
编程的复杂度远高于面向过程,不了解面向对象而立即上手基于它设计程序,极容易出现过度设计的问题。一些扩展性要求低的场景使用面向对象会徒增编程难度,如果用面向对象来设计linux,估计现在都没写完
-
无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法准确地预测最终结果。
面向对象
类和对象是面向对象中最重要的两个元素 在现实中是现有的对象 才有的类 而在编程中先有类在有对象
类
类类就是类型 是一系列对象中相似特征与技能的结合体
在生活中类是一种抽象概念把一些具有相似特种或者技能的事物归为一类
但是类中的对象是具有某个特定的特征和功能
在编程中比如我们以学生群体为一个类class student 学生都具备学习的功能 这些学生都属于同一所学校
我们可以在类中把这些变量和函数给定义了 但是学生有着自己本省的特征和技能 比如某个学生叫xxx 年龄18
这样就创建了一个对象把这些元素保存在这个对象里 这些元素是这个对象所特有的
对象
对象就是特征与技能的集合体
我们用变量来表示对象的特征 用函数来表示对象的技能
而这些变量和函数结合在一起就成为了一个整体 形成了一个对象
对象还有一种理解方式
变量的作用存储数据 而函数的作用处理数据