码迷,mamicode.com
首页 > 其他好文 > 详细

XML

时间:2016-05-23 06:45:50      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

XML

?

XML语法

DTD约束

PHP DOM

SimplexXML (xpath)

?

  1. 简介

?

  1. 发展史

?

  • gml ????????通用标记语言 ????????????1969年

    ?

    软件如果想实现高度的移植性,必须要有一个统一的标准

    ?

  • sgml ????标准通用标记语言????????1985年

?

  • html ????超文本标记语言????????????1993年

?

为了解决查看不同平台、不同浏览器访问同一个网页的内容

?

  • xml????????可扩展标记语言????????????1998年????????w3c

?

html:保存网站样式

xml:保存网站数据

?

  1. 什么是xml

?

extensible markup language

?

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

?

  1. html与xml的不同

?

  • html标签不能自定义,从标签上不能达到"见词知意"的目的

    ?

    html:<table><tr><td>手机:¥100.00</td></tr></table>

xml:<表格><行><列>手机:¥100.00</列></行></表格>

?

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

?

<table><tr><td>手机:¥100.00</td></tr></table>

????????

红色:格式

????????蓝色:数据

?

  • 不同浏览器解析html不同

    ?

    IE

    基于w3c模型

    ?

    不同浏览器解析xml基本上是相同的

?

  • html语法要求不严格

?

html:<table><tr><td>数据</td>、<br>

????????xml:<a></a>、<a />

?

  • 等等

?

  1. xml的主要用途

?

  • 程序之间的相互通讯

    Java-------àxml<------------php

????????Php------àxml?---------------javascript

  • 配置文件

    Config.php---------àphp项目

    Config.xml---------àjava、php、c# 、c++

?

  • 存储数据

    MYSQL数据库

    XML文件????

    ?

    JAVA+MYSQL

    JAVA+XML

?

  • 规范数据格式

?

财会部

????????员工编号

????????员工姓名

????????员工工龄

人力部

?

?

?

?

  1. 示例:

?

技术分享

?

  1. XML语法

?

  1. 快速入门

?

例1:使用xml保存一个人的信息

?

技术分享

?

?

?

?

?

?

?

?

?

?

?

?

?

?

例2:使用xml保存多个人的信息

?

技术分享

?

如何运行以上程序:

?

1)

技术分享

2)

技术分享

?

运行结果:

?

技术分享

?

  1. xml文件的构成

?

  • 文档声明
  • 元素
  • 元素属性
  • 注释
  • CDATA区
  • 特殊字符
  • 处理指令

?

  1. 文档声明

?

  • 需要先使用文档声明来声明XML文档
  • 最简单的语法:<?xml version="1.0"?>

    Version:版本号

  • encoding

    设置客户端浏览器查看时的编码格式

  • standalone

    表示当前xml文档是否独立

    ?

  1. 元素

?

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

    错误:<name>张三

    正确:<name>张三</name>

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

    正确:<a><b></b></a>

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

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

?

元素命名:

?

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

    合法:_、-、.

    不合法:!@#$%^&*()

  • 严格区分大小写;

    标签a和标签A是两个标签

    错误:<a>内容</A>

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

    正确:<a123>、<_123>

    错误:<12a>

  • 不能以xml(或XML、Xml等)开头

    <xml_a>

    <xml_b123>

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

    错误:<a b????c>

    正确:<a_b_c>

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

    错误:<a:b>

?

  1. 元素属性

?

技术分享

?

  • 一个元素可以有多个属性

    <person id=‘s102‘ sex=‘男‘>

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

    <person id=‘s102‘>

    <person id="s102">

  • 属性名称的命名规范与元素的命名规范相同
  • 元素中的属性是不允许重复的

    错误:<person id=‘s102‘ id=‘s103‘>

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

    <person id=‘s102‘>

    </person>

    可以改成:

    <person>

    ????<id>

    ????????s102

    ????</id>

    </person> 这两种方式表达含义是相同的

  1. 注释

?

<!--这是注释-->

?

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

    错误:<!-- <!-- --> -->

?

Html注释不会显示到页面上、xml注释会显示

?

技术分享

?

  1. CDATA区 (CDATA节)
  • CDATA:Character Data????????字符数据

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

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

?

技术分享

?

运行结果:

?

技术分享

?

?

?

?

?

  1. 特殊字符

?

对于一些特殊字符,若要在元素主体内容中显示,必须进行转义。

?

技术分享

?

技术分享

?

运行结果:

?

技术分享

?

?

分别在什么情况下使用CDATA区、特殊符号

?

如果需要转义的内容比较多,例如像一篇文件,使用CDATA比较节省时间

如果内容较少,例如像:3<5这样的表达式,可以使用特殊字符

?

  1. 处理指令

?

  • 作用:用来指挥软件如何解析XML文档。
  • 语法:必须以"<?"作为开头,以"?>"作为结尾。
  • 常用处理指令:

?

xml指令????:告诉浏览器:‘你‘用什么语法解析"我",用什么编码查看"我"

xml-stylesheet指令 :引用某个css文件对xml文件的样式进行控制

?

xml文件:

?

技术分享

?

Css文件:

?

技术分享

?

运行结果:

?

技术分享

?

总结:

?

我们今天讲了很多xml相关语法,现在我们写一个xml文件,只要符合xml语法,都可以正常使用浏览器访问,

?

比如说,我们需要对方向程序传递3项数据,但对方只传递两项,或:我要的是一个人的年龄,对方传递的是一个字符串"abc",也就是说,出现以上情况,说明数据是无效的

?

我们把符合xml语法的xml称为合法的xml

我们把符合dtd约束的xml称为合理的xml

?

合法的不一定是合理的

合理的一定是合法的

?

DTD约束

?

一、简介

?

1、为什么要使用约束技术

?

技术分享

?

2、什么是约束

?

  • XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束

    Xml文档

    约束文档

?

  • 约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。

?

????

格式良好的XML:遵循XML语法的XML

有效的XML:遵循约束文档的XML

?

遵循xml语法的是合法的xml

遵循约束文档的xml是合理的xml

?

合法的不一定是合理的,合理的一定是合法的

  1. 常用的约束技术

?

  • XML DTD
  • XDR
  • SOX
  • XML Schema

?

  1. dtd的含义

?

  • Document Type Definition
  • 文档类型定义
  • 约束XML的书写规范

?

  1. dtd的种类

?

  • 文件中????:内部dtd
  • 外部文件????:外部dtd

?

通过观查dtd代码出现在哪,来区分是哪种dtd

?

  1. 快速入门

?

例1:内部dtd

?

技术分享

?

?

?

?

?

例2:外部dtd

?

引用外部dtd的语法:

?

<!DOCTYPE 根元素 SYSTEM "DTD文档路径">

?

PUBLIC:公用

SYSTEM:私有

?

Xml文件:

?

技术分享

?

Dtd文件:

?

技术分享

?

  1. 如何校验

?

  1. 通过软件

?

双击安装文件

将文件解压至指定目录

技术分享

找到解压目录,并进入

找到msxmlval.inf文件,右键--à安装

在IE浏览器中,右键后,会有一个:validate xml的菜单,说明安装成功

?

技术分享

?

如果看到以上界面,说明xml完全遵循dtd约束

?

  1. 通过程序

?

  • new ActiveXObject("Microsoft.XMLDOM")
  • doc.validateOnParse=true;
  • doc.async=false
  • doc.load()
  • doc.parseError.reason
  • doc.parseError.line

?

技术分享

?

运行结果示例:

?

技术分享

?

?

二、dtd语法

?

  • 定义元素
  • 定义属性
  • 定义实体

?

1、定义元素

?

语法:

????

<!ELEMENT 元素名 使用规则>

?

使用规则:

?

  • (#PCDATA)????:表示内容为普通文本数据
  • EMPTY????????:表示元素内容必须为空
  • ANY????????????:元素出现任意次,一般用于根元素
  • (子元素)????????:子元素必须只出现一次
  • (子元素1,子元素2,……)????:子元素必须顺序出现
  • (子元素+)????????:子元素可以出现1次或多次
  • (子元素*)????????:子元素可以出现任意次
  • (子元素?)????????:子元素可以出现0次或1次
  • (子元素1|子元素2)????:子元素只能是括号里的内容,并且任选其一

?

代码示例:

?

技术分享

?

?

关于混合型的用法:

?

  • <!ELEMENT note (header,(message|body))>

?

<note>

????????<header></header>

????????<message></message>

</note>

<note>

????????<header></header>

????????<body></body>

</note>

?

?

?

?

  • <!ELEMENT note (header|message)*>

<note>

<header></header>
</note>

<note>

????<message></message>

</note>

<note>

????<header></header>

????<header></header>

</note>

<note>

</note>

?

2、定义属性

?

语法:

?

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

?

属性类型:

  • CDATA????:文本数据
  • (en1|en2|……)????:属性值任选其一
  • ID????:属性值必须是唯一的,必须以字母开头
  • IDREF????:属性值必须出现在之前的具有ID约束的属性值中

?

默认值:

  • #REQUIRED????非空、必添
  • #IMPLIED????????可选
  • #FIXED????????固定值
  • 值????????????默认值

?

?

?

?

?

?

?

?

?

?

代码示例:

?

技术分享

?

如果为同一个元素指定多个属性可以写成:

?

技术分享

?

?

?

?

?

?

?

?

?

?

?

?

关于IDREF的示例:

?

技术分享

?

电饭锅属于家用电器下的一个小分类,如果sid的值不存在所有一级分类的id中,则表示这是一条无效数据,所以需要使用IDREF进行约束

?

3、定义实体

?

定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容

?

  1. 内部实体

?

  • 定义语法:

?

????<!ENTITY 实体名称 "实体的值">

?

  • 引用语法:

?

????&实体名;

?

?

?

?

?

?

?

?

内部实体示例:

技术分享

?

2)外部实体

?

外部实体实际上是对某个外部的xml文件的引用,目前, 这种用法只在IE下支持

?

  • 定义语法:

?

????<!ENTITY 实体名称SYSTEM "URL">

?

  • 引用语法:

?

????&实体名;

?

?

?

?

代码示例:

?

技术分享

?

在上题中,使用FIRST和SECOND分别指向了first.xml和second.xml

?

在当前文件中,再使用实体引用将这两个xml文件合并到当前文件中。

?

?

内部实体是对一段文本的引用

外部实体是对一个文档的引用

内部实体

????解决同样的内容反复使用

外部实体

????解决将多个xml进行合并

?

参数实体

?

????解决定义dtd时同样的参数反复使用

?

  • 定义语法:

????<!ENTITY % 实体名称 "实体的值">

?

  • 引用语法:

????%实体名;

?

参数实体必须定义在外部dtd中

参数实体的定义必须放在dtd文件的最上面

?

代码示例:

?

技术分享

?

<a>

????<b>

????<c>

????<d>

</a>

<e>

????<b>

????<c>

????<d>

</e>

?

<!ENTITY % S "(b,c,d)">

?

<!ELEMENT a %S>

<!ELEMENT e %S>

?

?

目标:利用php实现对xml文件的解析

?

PHP DOM

SimpleXML

?

  1. PHP DOM

?

  1. 简介

?

dom:Document Object Model????文档对象模型

?

技术分享

?

当程序加载某个xml文件时,会在内存中形成上图结构

Persons是person的父节点

Person是Persons的子节点

Persons是person、name、age的祖先节点

Person、name、age是persons的后代节点

Name和age是兄弟节点

?

  1. 主要类:

?

  • DOMDocument ????:文档类
  • DOMNodeList????????:节点列表类
  • DOMNode????????????:节点类
  • DOMElement????????:元素类

?

?

?

?

?

  1. DOMDocument类

?

  1. 、创建DOMDocument对象

?

DOMDocument::__construct ([ string $version [, string $encoding ]] )

[ string $version :版本

[, string $encoding ]]????:编码格式

?

2)、加载xml

?

mixed DOMDocument::load ( string $filename)

string $filename:xml文件

?

3)、获取节点

?

DOMNodeList DOMDocument::getElementsByTagName ( string name )

通过元素名获取节点,返回的是一个节点列表类的对象

String $name:节点名

?

  1. DOMNodeList类

?

1)Length 长度(节点个数)

?

2)DOMElement DOMNodelist::item ( int $index )

????

返回指定索引的节点

?

  1. DOMNode类

?

?

  1. nodeValue????:节点的值

?

?

?

?

?

?

?

?

?

?

?

?

?

例1:查找第二个人的姓名

?

技术分享

?

例2:

?

技术分享

?

例3:

?

技术分享

?

?

?

?

?

?

?

?

?

?

?

例4:遍历一个xml中的所有数据

?

技术分享

?

?

  1. 关于属性的读取

?

  • bool DOMElement::hasAttribute ( string $name )

    判断节点是否具有某个属性

    String $name:属性名

?

  • bool DOMNode::hasAttributes ( void )

    判断节点是否具有属性

?

  • string DOMElement::getAttribute ( string $name )

    获取节点的某个属性的属性值

    String $name:属性名

?

技术分享

?

?

?

?

  1. 关于对xml的增删改操作

?

在增删改操作之前,一定要先找到这个节点的父节点

?

1)增加操作

?

DOMElement DOMDocument::createElement ( string $name [, string $value ] )

创建一个节点元素

string $name :元素名(标签名)

[, string $value ] :节点的值

?

DOMNode DOMNode::appendChild ( DOMNode $newnode )

追加子节点

DOMNode $newnode:要被追加的子节点

?

示例:

?

技术分享

?

记住:所有操作是在内存中完成的,并不会直接对文件本身有影响,所以需要对dom中的数据重新保存。

?

?

?

?

2)删除操作

?

DOMNode DOMNode::removeChild ( DOMNode $oldnode )

DOMNode $oldnode:要被删除的节点对象

?

技术分享

?

3)修改操作

?

DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode )

使用新节点替换原节点

DOMNode $newnode????:新节点

DOMNode $oldnode????:原节点

?

技术分享

?

4)保存操作

?

  • string DOMDocument::saveXML ????:将dom中的数据保存到一个字符串中
  • int DOMDocument::save ( string $filename ) :将dom中的数据保存到一个文件中

?

file_put_contents(‘1.txt‘,‘内容‘,FILE_USE_INCLUDE_PATH | FILE_APPEND)

?

  1. 关于属性的增删改

?

1)增加操作

?

DOMAttr DOMElement::setAttribute( string $name , string $value )

string $name :属性名

string $value :属性值

?

技术分享

?

2)修改操作

?

DOMAttr DOMElement::setAttribute( string $name , string $value )

????如果一个节点没有这个属性,那么这个方法就是添加操作

????如果一个节点有这个属性,那么这个方法就是修改操作

string $name :属性名

string $value :属性值

?

技术分享

?

3)删除操作

?

bool DOMElement::removeAttribute ( string $name )

string $name:要删除的属性名

?

技术分享

?

?

?

4)查询操作

?

string DOMElement::getAttribute ( string $name )

string $name:属性名

?

技术分享

?

?

二、SimpleXML

?

PHP DOM:增删改操作

SimpleXML:查询操作????xpath

?

1、读取xml

?

  • SimpleXMLElement simplexml_load_file ( string $filename)

    ?

    从一个xml文件中读取数据

    string $filename:xml文件名

    这个函数返回的是一个SimpleXMLElement类的实例

    ?

  • SimpleXMLElement::__construct ( string data)

?

从一个xml字符串读取数据

这个函数返回的是一个SimpleXMLElement类的实例

?

SimpleXMLElement

?

技术分享

?

例1:查找第2个人的信息

?

技术分享

?

?

?

?

?

?

?

?

?

?

?

?

?

?

例2:查询所有人的所有信息

?

技术分享

?

2、获取子节点

?

public SimpleXMLElement SimpleXMLElement::children()

返回所有子节点

?

技术分享

?

3、如何向客户端输出xml格式的数据

?

技术分享

?

使用header函数向客户端表示:"我"给"你"发的是一段xml格式的数据

4、添加节点

?

public SimpleXMLElement SimpleXMLElement::addChild ( string $name [, string $value] )

string $name :元素名

[, string $value] :节点值

?

Php dom在添加节点时需要先将dom节点对象创建出来,再进行添加

Simplexml 在添加节点时直接添加,不需要创建

?

Php dom在添加时没有顺序上的要求,上-à下 下--à上都可以

Simplexml在添加时必须从上向下挂载

?

技术分享

?

5、添加属性

?

public void SimpleXMLElement::addAttribute ( string $name, string $value)

string $name:属性名

string $value:属性值

?

技术分享

?

6、保存

?

public mixed SimpleXMLElement::asXML ([ string $filename ] )

?

string $filename:将xml数据保存到指定的xml文件中.

?

技术分享

?

?

?

?

  1. XPATH

?

在simplexmlelement这个类下,有一个方法:xpath

?

public array SimpleXMLElement::xpath ( string $path )

?

string $path:一个xpath路径,必须符合xpath语法

?

1、什么是xpath

?

  • XPath是一门在 XML 文档中查找信息的语言。
  • XPath可用来在 XML 文档中对元素和属性进行遍历。

?

数据库:sql

xml:xpath

?

2、代码示例:

?

例1:基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径

?

  • /students????:返回students元素
  • /students/student/name????:返回所有人的姓名

?

最后一个 / 后面的是什么,返回的就是什么

?

?

技术分享

?

?

?

?

例2:如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)

?

  • //name????:返回所有层级中的name元素
  • //student/name????:返回所有student元素下的name元素

?

技术分享

?

<a>

????<b>

????????<c>

????????????<d>

????????????????<e>aaa</e>

?

/a/b/c/d/e

//e

?

例3:星号 * 表示选择所有由星号之前的路径所定位的元素

?

  • /students/student/* :返回student元素下的所有子元素

?

技术分享

?

?

例4:方块号里的表达式可以进一步的指定元素

?

  • /students/student[1] :表示返回第几个元素 数字是从1开始排列

?

技术分享

?

?

?

?

例5:方块号里的表达式可以进一步的指定元素

?

  • /students/student[@id] :表示返回所有具有id属性的student元素

?

技术分享

?

例6:方块号里的表达式可以进一步的指定元素

?

/students/student[age>18] :表示返回所有年龄大于18的所有同学

/students/student[age=20] :表示返回年龄等于20的所有同学

/students/student[name=‘zhangsan‘] :表示返回姓名为zhangsan的所有同学

?

技术分享

?

?

  1. 在线词典

?

技术分享

?

技术分享

?

代码见:data/data.xml add.php search.php

?

?

Id name age

?

Insert into student values(null,‘zhangsan‘,‘30‘);

?

$query="Insert into student values(null,‘$name‘,$age)";

?

/students/student[name=‘zhangsan‘]

?

/student/student[name=‘$w1‘]

?

?

XML

标签:

原文地址:http://www.cnblogs.com/yizhinageyuanfang/p/5518565.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!