XML
XML:
什么是xml:全程叫做可扩展标记语言。
是一种定义电子文档结构和描述的语言,可以用来标记数据、定义数据类型。
用户可以对自己的标记语言进行定义和扩展,由W3C(万维网标准组织)推出,几乎所有的编程语言都支持该格式
标记翻译为标签,标签指的是某种特殊符号,简单的说XML就是标签来定义文档结构和数据。
XML文档格式
来看一个例子:
<person name="jack">hello i am a person</person>
一个完整的标签分为三个部分:
标签名(tagname) 属性(attribute) 文本(text)
属性和文本都是可选的,所以你可以这样来定义一个空标签
<person></person>
其他格式要求:
一、任何的起始标签都必须有一个结束标签。
二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法
是在大于符号之前紧跟一个斜线(/)例如<person/>。
XML解析器会其翻译为<person></person>
三、标签必须按顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的
四、所有的属性都必须有值
五、所有的属性都必须在值的周围加上双引号
六、最外层必须有且只能有一个标签,称为根标签
与JSON的对比
而xml支持的数据类型理论上是不受限制的,因为可以完全自定义标签的结构和含义,使用场景也非常广泛,不局限于前后台的数据交互,在一些语言中还经常作为配置文件来使用
另外,HTML 看起来与XML非常的类似,的确,HTML也属于XML
如果仅仅将XML用做数据交换格式的话,远不如json来的简单,由于出现时间的关系,有很多早期项目都是使用XML来完成的
使用XML模块解析
准备数据:
<?xml version="1.0"?>
<data>
<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>
</data>
解析XML
import xml.etree.ElementTree as ET #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')
三个用于查找标签函数
iter(‘标签名’)#全文查找
find(‘标签名’)#查找子节点匹配的第一个
findall(‘标签名’)# 查找子节点匹配的所有标签
访问标签的内容
element.tag 获取标签名
element.attrib 获取属性
element.text 获取文本
修改文档内容
element.tag = ‘标签名’
element.text = ‘文本’
element.set(‘属性名’,‘属性值’)
删除节点
root.remove(标签对象)
添加字标签
创建标签对象
year = ET.Element(‘year’) # 指定名称
year.text = ‘新年’
year.attrib = {‘update’:‘yes’}
#添加
country.append(year) #往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内核,git
为什么需要面向对象:
因为当今时代背景下,通常应用程序对扩展性和维护性要求都是非常高的,为什么?想想qq,游戏,因为面向的群从,所以需要不断的更新和维护。
什么是面向对象编程
面向对象编程——Object Oriented Programming, 简称OOP,是一种编程思想。
它将对象作为程序的基本单元
将数据和处理数据的程序封装到对象中
以提高软件的复用性,灵活性和扩展性为首要目的
面向对象编程优缺点
案例分析1:把大象装进冰箱如何实现
案例分析2: 要分开一家公司
面向对象编程的优点:提高了扩展性,复用性,维护性
缺点:解决问题的复杂化高于面向过程
类与对象
对象:
就是特征与技能的结合体
类:
就是一系列有相同特征和技能的对象的集合体
创建类与对象:
定义类:
以学生类Student为例,在Python 中,定义类通过class关键字:
class Stduent:
pass
class 后面紧接着是类名,即Student,遵循python 编码规范,类名通常是大写开头的单词,多个单词时使用驼峰命名法
创建对象
创建对象也称之为实例化,定义好
stu1 = Student()
print(stu1)
#输出 <__main__.Student object at 0x10b11d588>
print(Student)
#输出 <class '__main__.Student'>
根据输出可以看到
变量名stu1指向一个Student类的实例,0x10b11d588是实例的内存地址,每个实例的地址都不相同,
Student本身则是一个类(class)
对象的属性操作
对象是特征(属性)与行为(方法)的结合体
stu 这个东西目前不具备任属性和方法,要为其添加属性可以在创建对象后使用点语法(变量名加.)比如为stu 对象添加name属性
stu1.name = ‘Jerry’
同样通过点语法来获取对象的属性值
print(stu1.name) # Jerry