万能的数据传输格式——XML/json

一、XML简介

1、历史起源

gml(1969)->sgml(1985)->html(1993)->xml(1998)

Genaral  Markup  language

gml :通用标记语言

IBM 1969 家共同研究一个课题:一个程序如何运行在多个系统中(系统可移植性)

sgml :标准通用标记语言

IBM 1985 对基本的gml进行了升级

html :英国科学家博纳斯.  sgml 中定义了20html标签实现了世界上第一个网页

html 1993 W3C 进行推广和使用

xml 1998 

2、什么是xml

XML

    称:Extensible Markup Language

中文名:可扩展标记语言

用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,允许用户对自己的标记语言进行定义的源语言。

面试题:什么是XMLXML主要用途是什么?

答:可扩展标记语言,XML用于传输数据与存储数据

3xmlhtml区别

1)html标签不能自定义,从标签上不能达到“见词知意”的目的

<table></table>

<表格></表格>

2)html将数据与格式绑定在一起

xml只负责数据的传输与存储,其标签没有任何意义

3)不同浏览器解html不同

html语法要求不严格

等等

html主要用于数据的显示,xml主要用于数据传输

4xml应用场景

1)充当程序间交互的中间件(通讯标准)

快递100接口(Java XML PHP

2)小型数据库

php+mysql 金山词霸

php+xml 金山词霸

5、xml传输原理

图片1

 

二、XML基本语法

1、快速入门

2xml基本语法

文档声明

元素

元素属性

注释

特殊字符

l CDATA区段

处理指令

1)文档声明

需要先使用文档声明来声明XML文档

最简单的语法:

l <?xml version=“1.0” encoding=“utf-8”?>

version 版本为1.0 (代表当前xml文档的版本)

encoding 编码格式 (编码格式utf-8big5gb2312

standalone 是否独立(是否依靠dtd文件)  默认yes

作用:告诉浏览器在解释时所采用的版本与格式等信息

2)元素(标记、标签)

一个标签分为起始和结束标签(不能省略)

错误:<title>三国志

正确:<title>三国志</title>  

      <title />

一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套

错误:<title><price></title></price>

正确:<title><price></price></title>

一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签

<html>

<head></head>

</html>

元素的命名规则

元素(标签)的名称可以包含字母、数字、减号、下划线和英文句点

    正确的:<abc></abc>

    错误的:<!@#></!@#>

严格区分大小写;

正确的:<abc></abc>

错误的:<abc></ABC>

只能以字母或下划线开头;

正确的:<abc123></abc123>

错误的:<123abc></123abc>

名称字符之间不能有空格或制表符;

正确的:<abc></abc>

错误的:<a b c></a b c>

名称字符之间不能使用冒号

正确的:<abc></abc>

错误的:<ab:c></ab:c>

3)元素属性

一个元素可以有多个属性

属性值一定要用引号(单引号或双引号)引起来

属性名称的命名规范与元素的命名规范相同

元素中的属性是不允许重复的

标签属性所代表的信息也可以被改成用子元素的形式来描述

4)注释

基本语法:

<!--注释内容-->

注:XML声明之前不能有注释,注释不能嵌套

5)特殊字符

可以使用以下字符代替xml文档中的特殊字符

图片2

 

6CDATA区段(CDATA节)

CDATACharacter Data

作用:把标签当做普通文本内容

语法:<![CDATA[内容]]>

示例代码:

对于特殊字符与CDATA区段,比较?

共同点:都是用于对特殊字符的转化

不同点:特殊字符只能用于数据量较少的情况,比如小于号、大于号等情况

  CDATA区段可以用于大批量数据的转化,如文章描述、文章内容等信息

PHP XML解析原理

1为什么需要XML解析

图片3

 

2如何进行XML解析(PHP

PHP DOM模型进行XML解析(增加、修改、删除)

PHP SimpleXML查询)

Json  json_encode()  json_decode()(推荐)

PHP DOM解析XML

1PHP DOM模型

4PHP解析XML步走:

1在内存中开辟存储空间——”

2加载XML文件到内存,并形成DOM树结构

3获取同级兄弟节点——“

4、获取指定的文本节点并读取其值——“

a)开辟内存空间,形成

要用到的知识点:

DOMDocument

图片4

 

参数说明:

$versionxml版本号,采用1.0

$encoding编码格式,utf-8

b)加载XML文件到内存,形成DOM结构

要用到的知识点:

图片5

 

参数说明:

$filename要载入xml文件的名称

c找到同级兄弟节点,形成

要用到的知识点

DOMNodeList

图片6

 

参数说明

$length获取到当前串的长度

item(索引,默认从0开始)获取指定节点

getElementsByTagName()

图片7

 

参数说明:

$name要获取元素标签、标记)的名称

d)获取同级兄弟节点输出其值

要用到的知识点:

图片8

 

参数说明:

$index通过索引获取指定元素

2PHP DOM查询与遍历

3PHP DOM增加操作

增加四步走:

1开辟面空间

2载入xml到内存,形成DOM

3)创建节点并追加

4保存内存数据到XML文件中

要用到的知识点:

图片9

 

参数说明:

$name :创建的节点名称

$value 可选参数,创建节点的值

图片10

 

参数说明:

$newnode 追加的新节点名称(要求类型为DOMElementDOMNode

图片11

 

参数说明:

$filename:要保存xml文件名称

4PHP DOM删除操作

删除操作步走:

1)开辟内存空间,形成

2载入xml文件到内存

3找到要删除的节点

4找到其父节点移除指定的子节点

5保存内存数据到xml文件中

要用到的知识点:

图片12

 

参数说明:

$oldnode要移出的节点

5PHP DOM更新操作

PHP DOM更新操作分为两种:

1值操作,只更新某个节点的值信息通过nodeValue属性设置即可

2节点操作,需要特定的函数辅助完成通过replaceChild方法设置即可

值更新操作步走:

1开辟内存空间,形成

2载入xml文件到内存,形成dom

3)找到要更新的节点,更新其值

4保存内存数据到XML文件中

节点更新操作六步走

1开辟内存空间,形成

2载入xml文件到内存

3)创建新节点

4找到旧节点

5)找到父节点,然后新节点替换老节点

6保存内存数据到XML文件中

要用到的知识点:

图片13

 

参数说明:

$newnode:创建的新节点

$oldnode:要更新的旧节点

6属性操作

1属性的添加更新操作

要用到的知识点:

图片14

 

在属性的添加与更新操作用到的是同一个方法setAttribute当当前元素无属性时,系统会自动添加属性,如果已存在,则更新其值

参数说明:

$name属性名称

$value属性的值

2属性的判断与读取操作

bool DOMElement::hasAttribute ( string $name ) :判断当前元素是否具有某一属性

bool DOMNode:: hasAttributes ( void ) :判断当前元素是否具有属性

string DOMElement::getAttribute( string $name ) 获取元素的属性

参数说明:

$name 属性名称

3移除属性

要用到的知识点:

bool DOMElement::removeAttribute ( string $name )

参数说明:

$name要移出的属性名称

PHP SimpleXML实现对XML增删改查

1、载入XML文件到内存,并形成SimpleXML对象

simpleXMLElement simplexml_load_file ( string $filename) 载入xml文件到内存并生成simpleXML对象

SimpleXMLElement::__construct ( string data)

示例代码:

2输入指定文本节点的值

3遍历输出所有数据

方法一:通过foreach直接遍历数组

方法二:

通过children()方法实现对xml数据的遍历输出

图片15

 

该方法可以直接获取到当前对象的子节点

4输出属性

simplexml对象中,对于属性的读取有些特殊,不能通过以上方法直接读取,必须借助外在方式:

通过数组方式直接读取:

通过attributes()方法获取到属性对象,并输入属性的值

图片16


原文地址:https://www.cnblogs.com/wepe/p/7424642.html