标签:
XML
?
XML语法
DTD约束
PHP DOM
SimplexXML (xpath)
?
?
?
?
软件如果想实现高度的移植性,必须要有一个统一的标准
?
?
?
为了解决查看不同平台、不同浏览器访问同一个网页的内容
?
?
html:保存网站样式
xml:保存网站数据
?
?
extensible markup language
?
用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言(允许用户自定义)。
?
?
?
html:<table><tr><td>手机:¥100.00</td></tr></table>
xml:<表格><行><列>手机:¥100.00</列></行></表格>
?
?
<table><tr><td>手机:¥100.00</td></tr></table>
????????
红色:格式
????????蓝色:数据
?
?
IE
基于w3c模型
?
不同浏览器解析xml基本上是相同的
?
?
html:<table><tr><td>数据</td>、<br>
????????xml:<a></a>、<a />
?
?
?
Java-------àxml<------------php
????????Php------àxml?---------------javascript
Config.php---------àphp项目
Config.xml---------àjava、php、c# 、c++
?
MYSQL数据库
XML文件????
?
JAVA+MYSQL
JAVA+XML
?
?
财会部
????????员工编号
????????员工姓名
????????员工工龄
人力部
?
?
?
?
?
?
?
?
例1:使用xml保存一个人的信息
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
例2:使用xml保存多个人的信息
?
?
如何运行以上程序:
?
1)
2)
?
运行结果:
?
?
?
?
?
Version:版本号
设置客户端浏览器查看时的编码格式
表示当前xml文档是否独立
?
?
错误:<name>张三
正确:<name>张三</name>
正确:<a><b></b></a>
错误:<a><b></a></b>
?
元素命名:
?
合法:_、-、.
不合法:!@#$%^&*()
标签a和标签A是两个标签
错误:<a>内容</A>
正确:<a123>、<_123>
错误:<12a>
<xml_a>
<xml_b123>
错误:<a b????c>
正确:<a_b_c>
错误:<a:b>
?
?
?
<person id=‘s102‘ sex=‘男‘>
<person id=‘s102‘>
<person id="s102">
错误:<person id=‘s102‘ id=‘s103‘>
<person id=‘s102‘>
</person>
可以改成:
<person>
????<id>
????????s102
????</id>
</person> 这两种方式表达含义是相同的
?
<!--这是注释-->
?
错误:<!-- <!-- --> -->
?
Html注释不会显示到页面上、xml注释会显示
?
?
????作用:把标签当做普通文本内容
????语法:<![CDATA[内容]]>
?
?
运行结果:
?
?
?
?
?
?
?
对于一些特殊字符,若要在元素主体内容中显示,必须进行转义。
?
?
?
运行结果:
?
?
?
分别在什么情况下使用CDATA区、特殊符号
?
如果需要转义的内容比较多,例如像一篇文件,使用CDATA比较节省时间
如果内容较少,例如像:3<5这样的表达式,可以使用特殊字符
?
?
?
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
?
合法的不一定是合理的,合理的一定是合法的
?
?
?
?
?
?
通过观查dtd代码出现在哪,来区分是哪种dtd
?
?
例1:内部dtd
?
?
?
?
?
?
例2:外部dtd
?
引用外部dtd的语法:
?
<!DOCTYPE 根元素 SYSTEM "DTD文档路径">
?
PUBLIC:公用
SYSTEM:私有
?
Xml文件:
?
?
Dtd文件:
?
?
?
?
双击安装文件
将文件解压至指定目录
找到解压目录,并进入
找到msxmlval.inf文件,右键--à安装
在IE浏览器中,右键后,会有一个:validate xml的菜单,说明安装成功
?
?
如果看到以上界面,说明xml完全遵循dtd约束
?
?
?
?
运行结果示例:
?
?
?
二、dtd语法
?
?
1、定义元素
?
语法:
????
<!ELEMENT 元素名 使用规则>
?
使用规则:
?
?
代码示例:
?
?
?
关于混合型的用法:
?
?
<note>
????????<header></header>
????????<message></message>
</note>
或
<note>
????????<header></header>
????????<body></body>
</note>
?
?
?
?
<note>
<header></header>
</note>
或
<note>
????<message></message>
</note>
或
<note>
????<header></header>
????<header></header>
</note>
或
<note>
</note>
?
2、定义属性
?
语法:
?
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
?
属性类型:
?
默认值:
?
?
?
?
?
?
?
?
?
?
代码示例:
?
?
如果为同一个元素指定多个属性可以写成:
?
?
?
?
?
?
?
?
?
?
?
?
?
关于IDREF的示例:
?
?
电饭锅属于家用电器下的一个小分类,如果sid的值不存在所有一级分类的id中,则表示这是一条无效数据,所以需要使用IDREF进行约束
?
3、定义实体
?
定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容
?
?
?
????<!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
?
?
?
dom:Document Object Model????文档对象模型
?
?
当程序加载某个xml文件时,会在内存中形成上图结构
Persons是person的父节点
Person是Persons的子节点
Persons是person、name、age的祖先节点
Person、name、age是persons的后代节点
Name和age是兄弟节点
?
?
?
?
?
?
?
?
?
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)Length 长度(节点个数)
?
2)DOMElement DOMNodelist::item ( int $index )
????
返回指定索引的节点
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
例1:查找第二个人的姓名
?
?
例2:
?
?
例3:
?
?
?
?
?
?
?
?
?
?
?
?
例4:遍历一个xml中的所有数据
?
?
?
?
判断节点是否具有某个属性
String $name:属性名
?
判断节点是否具有属性
?
获取节点的某个属性的属性值
String $name:属性名
?
?
?
?
?
?
在增删改操作之前,一定要先找到这个节点的父节点
?
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)保存操作
?
?
file_put_contents(‘1.txt‘,‘内容‘,FILE_USE_INCLUDE_PATH | FILE_APPEND)
?
?
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
?
?
从一个xml文件中读取数据
string $filename:xml文件名
这个函数返回的是一个SimpleXMLElement类的实例
?
?
从一个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文件中.
?
?
?
?
?
?
在simplexmlelement这个类下,有一个方法:xpath
?
public array SimpleXMLElement::xpath ( string $path )
?
string $path:一个xpath路径,必须符合xpath语法
?
1、什么是xpath
?
?
数据库:sql
xml:xpath
?
2、代码示例:
?
例1:基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径
?
?
最后一个 / 后面的是什么,返回的就是什么
?
?
?
?
?
?
例2:如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)
?
?
?
<a>
????<b>
????????<c>
????????????<d>
????????????????<e>aaa</e>
?
/a/b/c/d/e
//e
?
例3:星号 * 表示选择所有由星号之前的路径所定位的元素
?
?
?
?
例4:方块号里的表达式可以进一步的指定元素
?
?
?
?
?
?
例5:方块号里的表达式可以进一步的指定元素
?
?
?
例6:方块号里的表达式可以进一步的指定元素
?
/students/student[age>18] :表示返回所有年龄大于18的所有同学
/students/student[age=20] :表示返回年龄等于20的所有同学
/students/student[name=‘zhangsan‘] :表示返回姓名为zhangsan的所有同学
?
?
?
?
?
?
代码见: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‘]
?
?
标签:
原文地址:http://www.cnblogs.com/yizhinageyuanfang/p/5518565.html