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的对比

json是JavaScript语言的对象表示法,其仅支持js中的数据类型,(虽然大多数情况下是足够使用的),之所以出现是因为在开发中,通常都需要后台向前台传输数据,那自然是要传输前台能看懂的数据格式,json就是这样一种数据格式,可以轻松的被js语言解析,使用场景多为前后台交互

而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 编码规范,类名通常是大写开头的单词,多个单词时使用驼峰命名法

创建对象

创建对象也称之为实例化,定义好Student类后,就可以根据Student类创建出Student的实例,创建实例通过类名加上()实现:

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

 

posted @ 2019-05-15 17:11  帅气逼人23  阅读(203)  评论(0编辑  收藏  举报