xml+dtd约束(很详细)
XML(可扩展性标记语言)
概述
xml被发明的目的是传输和存储数据,而不是展示数据
xml的标签必须自定义,但是在写标签名的时候一定要有含义
XML的功能
- 两个网站和两个程序之间的数据传输
- 配置文件 config.xml
- 存储数据,充当小型数据库中
作用:规范数据格式,使数据具有结构性,易读易处理
xml与html不同之处
- html标签不能自定义,xml标签只能自定义
- html标签语法要求不严格;xml语法要求极其严格,必须是成对标签
- xml是用来传输和存储数据,html用来展示数据
简单的xml
<root>
<user>star</user>
<msg>大美女</msg>
</root>
xml的基本语法
- 必须有根节点;根节点是其他所有节点的父节点(上述代码的父节点就是root)
- xml的头声明可有可无,建议书写
- 所有的xml标签必须是成对的
- 标签名区分大小写
- 标签不可以交叉书写
- 在xml使用如下字符需要转义
< ; | < |
---|---|
> | > |
& | & |
' | ’ |
" | " |
元素属性
规则
-
一个标签可以有多个属性,属性的值必须使用引号引起来
-
命名时数字不能开头
-
属性时表示标签自身的一些额外信息,在xml中可有可无
CDATA
语法格式
<![CDATA[不需解析的内容]]>
在特殊字符较少时使用转义字符,特殊字符较多时使用CDATA
php解析xml
X ML是一种数据传输格式,当 PHP 接收到的数据就是一段 XML 的时候,我们的 PHP 应该怎么处理 X ML数据呢?
在 PHP5版本以后,其提供了一个非常非常强大的类库Simplexml 类库,专门用于实现对XML文档的解析操作。
xml解析原理
- 读取xml文档中的内容
- 形成dom树
- 由dom树生成对象并返回
simplexml库
simplexml_load_file():转换 XML 文件为 SimpleXMLElement 对象,然后输出对象的键和元素;返回的是一个对象
<?php
$xml=simplexml_load_file("123.xml");
//var_dump($xml);
echo $xml->user[0]->name;
?>
获取某一个元素的信息
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimage-adadadad.oss-cn-beijing.aliyuncs.com%2Fimg%2F202407241550833.png&pos_id=img-dgTO2QQq-1721967251774
使用php给xml添加节点
使用addChild()函数插入一个节点
<?php
$xml=simplexml_load_file("123.xml");
//使用addChild添加节点
$u=$xml->addChild('user');
$u->addChild('name','小王');
$u->addChild('age','20');
获取某一个元素的信息
使用php给xml添加节点
使用asXML()函数将增加的内容插入到123.xml中
<?php
$xml=simplexml_load_file("123.xml");
//使用addChild添加节点
$u=$xml->addChild('user');
$u->addChild('name','小王');
$u->addChild('age','20');
//使用asXML向123.xml中插入新增节点
$xml->asXML("123.xml");
?>
DTD约束
Document Type Difinition(文档类型自定义),约束XML文档中可以出现的内容,并且XML的解析程序可以自动使用DTD验证XML文档
出现的地方
- 直接写在XML文档的前面声明DTD,通常开发的时候会使用这种方式
<!DOCTYPE 根元素[
<!-- 约束根元素中有哪些子元素 -->
<!ELEMENT 根元素 (子元素)>
.......
- 使用单独的DTD文件声明DTD,然后XML里面引入进来,开发好后,把内容和DTD分离,DTD迁移到单独文件中
DTD语法
内部的DOCYPE语法
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
<!DOCTYPE root-element [element-declarations]>
元素的约束
<!ELEMENT element-name (#PCDATA)>
实例:
<!ELEMENT from (#PCDATA)>
子元素出现的次数
默认1次
+:1-N次
?:0-1次
*:0-N次
<!ELEMENT root (user+)>
<!-- user子元素可以出现多次 -->
属性约束
<!ATTLIST 元素名 属性名 数据类型 默认值>
<!-- 实例-->
<!ATTLIST payment type CDATA "check">
完整实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!-- 约束根元素中有哪些子元素-->
<!ELEMENT root (user+)>
<!-- 约束一级元素中有哪些对应二级元素 -->
<!ELEMENT user (name,age,hobbys?)>
<!-- 约束二级元素hobbys中有哪些三级元素-->
<!ELEMENT hobbys (hobby+)>
<!ELEMENT hobby (#PCDATA)>
<!-- 约束具体的二级元素-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST user id ID #REQUIRED>
]>
<root>
<user id="a1">
<name>star</name>
<age>18</age>
<hobbys>
<hobby>唱歌</hobby>
<hobby>跳舞</hobby>
</hobbys>
</user>
<user id="a2">
<name>xiaoming</name>
<age>19</age>
</user>
<user id="a3">
<name>小王</name>
<age>20</age>
</user>
<user id="a4">
<name>小刘</name>
<age>18</age>
</user>
</root>
引入外部DTD约束
<!DOCTYPE root-element SYSTEM "filename">
<!DOCTYPE root-element PUBLIC "filename">
SYSTEM通常表示私有的、自定义的DTD
PUBLIC通常表示公认的,别人定义的,规范的DTD
实例
dtd文件中的内容
<!-- 约束根元素中有哪些子元素-->
<!ELEMENT root (user+)>
<!-- 约束一级元素中有哪些对应二级元素 -->
<!ELEMENT user (name,age,hobbys?)>
<!-- 约束二级元素hobbys中有哪些三级元素-->
<!ELEMENT hobbys (hobby+)>
<!ELEMENT hobby (#PCDATA)>
<!-- 约束具体的二级元素-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST user id ID #REQUIRED>
查看是否引入成功
标签:xml,XML,dtd,标签,约束,语法,DTD,节点 From: https://blog.csdn.net/2401_83176532/article/details/140712303