xml+dtd约束(很详细)

XML(可扩展性标记语言)

概述

xml被发明的目的是传输和存储数据,而不是展示数据

xml的标签必须自定义,但是在写标签名的时候一定要有含义

XML的功能

  1. 两个网站和两个程序之间的数据传输
  2. 配置文件 config.xml
  3. 存储数据,充当小型数据库中

作用:规范数据格式,使数据具有结构性,易读易处理

xml与html不同之处

  1. html标签不能自定义,xml标签只能自定义
  2. html标签语法要求不严格;xml语法要求极其严格,必须是成对标签
  3. xml是用来传输和存储数据,html用来展示数据

简单的xml

<root>
<user>star</user>
<msg>大美女</msg>
</root>

image-20240724145326782

xml的基本语法

  • 必须有根节点;根节点是其他所有节点的父节点(上述代码的父节点就是root)
  • xml的头声明可有可无,建议书写

image-20240724150335679

  • 所有的xml标签必须是成对的
  • 标签名区分大小写

image-20240724150749744

  • 标签不可以交叉书写

image-20240724151303917

  • 在xml使用如下字符需要转义
&lt;<
&gt;>
&amp;&
&apos;
&quot;"

元素属性

image-20240724152608513

规则

  • 一个标签可以有多个属性,属性的值必须使用引号引起来

  • 命名时数字不能开头

  • 属性时表示标签自身的一些额外信息,在xml中可有可无

CDATA

语法格式

<![CDATA[不需解析的内容]]>

image-20240724153652503

在特殊字符较少时使用转义字符,特殊字符较多时使用CDATA

php解析xml

X ML是一种数据传输格式,当 PHP 接收到的数据就是一段 XML 的时候,我们的 PHP 应该怎么处理 X ML数据呢?

在 PHP5版本以后,其提供了一个非常非常强大的类库Simplexml 类库,专门用于实现对XML文档的解析操作。

xml解析原理

  1. 读取xml文档中的内容
  2. 形成dom树
  3. 由dom树生成对象并返回

simplexml库

simplexml_load_file():转换 XML 文件为 SimpleXMLElement 对象,然后输出对象的键和元素;返回的是一个对象

<?php
$xml=simplexml_load_file("123.xml");
//var_dump($xml);
echo $xml->user[0]->name;
?>

image-20240724160653675

获取某一个元素的信息

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](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');

image-20240724161727880

获取某一个元素的信息
image-20240724155037766

使用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");
?>

image-20240724162231997

DTD约束

Document Type Difinition(文档类型自定义),约束XML文档中可以出现的内容,并且XML的解析程序可以自动使用DTD验证XML文档


出现的地方

  1. 直接写在XML文档的前面声明DTD,通常开发的时候会使用这种方式
<!DOCTYPE 根元素[
    <!-- 约束根元素中有哪些子元素 -->
    <!ELEMENT 根元素 (子元素)>
        .......
  1. 使用单独的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">

image-20240726115005316

image-20240726115106313

完整实例
<?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

实例

image-20240726120621063

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>

查看是否引入成功

image-20240726120838754

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值