Loading

XML详解

0X00-引言

看我不卷死你们(1)(1)

XML学习笔记,配套视频

0X01-XML概述

01-引入

01-XML是什么样的
<cs>
    <app>
        <id>1</id>
        <name>baidu translate</name>
        <virsion>3.0</virsion>
    </app>
    <app>
        <id>2</id>
        <name>你好</name>
        <version>2.1</version>
    </app>
    <app>
        <id>3</id>
        <name>我很好</name>
        <version>3.3</version>
    </app>
</cs>
02-XML数据格式主要用途有哪些?
  • XML数据格式的主要作用是数据传输

  • 程序之间的数据传输通讯,数据的载体,各编程语言都可以识别

  • 配置文件 config.xml,xml文件在各个语言中具有通用性,可以做配置文件

  • 存储数据,可以当做小型数据库,直接以文件的形式存储数据

  • 规范数据格式,使数据具有结构性

02-什么是XML

  • XML指的是,可扩展标记性语言
  • XML被发明的目的是传输数据和存储数据,而不是展示数据(HTML)
  • XML的标签要具有含义
  • XML是W3C推举的数据传输格式

03-XML与HTML有什么不一样

  • HTML标签不能自定义,XML标签只能自定义
  • HTML语法要求不严格,XML语法要求极其严格,必须成对存在
  • XML用来传输和存储数据,HTML用来展示数据

0X02-XML的基本语法

01-语法规则

  • XML必须要有根节点,根节点就是其他所有节点的父级节点
  • XML头部声明,可有可无,最好写上
  • 所有XML元素都必须是成对标签
  • 标签名区分大小写
  • 标签不能交叉

image-20220104110657580

  • 注释符:<!-- -->

image-20220104111141034

  • 特殊字符需要实体转义
转义符 转义内容 说明
&amp; 或 & &
&lt; 或 < < 小于号
&gt; 或 > < 小于号
&quot; " 双引号
&nbsp; 空格
&copy; © 版权符
&reg ® 注册符

02-元素属性

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

  • 属性就是表示标签自身的一些额外的信息

  • XML中属性就是鸡肋,因为标签可以自定义

  • 解析XML数据时,属性会带来额外的解析代码(多了一步,比较麻烦)

  • 写法<name age="38">太白</name>和HTML一样

03-CDATA区域

CDATA区域不解析

注意:特殊字符较少时,使用实体替换,较多时使用CDATA,注意大写

image-20220104121307818

04-XML文档类型声明(DTD)

XML学习网站

XML文档类型声明(俗称DTD)是一种精确描述XML语言的方式。DTD根据适当XML语言的语法规则检查XML文档结构的词汇和有效性。

可以在文档中指定XML DTD,也可以将其保存在单独的文档中,然后单独添加。

01-用法
<!DOCTYPE element DTD identifier
[
   declaration1
   declaration2
   ........
]>

DTD开始于<!DOCTYPE分隔符,解析器判断为XML文档,从根元素解析文档。方括号[]包含一个为Internal Subset的实体声明的可选列表。

02-内部DTD

内部DTD指的是直接在XML文件中声明元素

XML头部声明中的属性standalone="yes"

语法

<!DOCTYPE root-element [element-declarations]>

直接例子分析

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE address [
   <!ELEMENT address (name,company,phone)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT company (#PCDATA)>
   <!ELEMENT phone (#PCDATA)>
]>
<address>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</address>

头部声明

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

DTD文档类型声明,以<!DOCTYPE开始,解析器认为与XML文档相关。

<!DOCTYPE address [

在DTD的正文中可以声明元素,属性,实体和符号

<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>

<!ELEMENT address (name,company,phone)>中address为根节点,圆括号内的内容为子节点。

<!ELEMENT name (#PCDATA)><!ELEMENT name(#PCDATA)>将元素名称定义为“#PCDATA”类型。这里#PCDATA表示可分析的文本数据。

规则:

DTD声明必须放在文档的开头XML头部声明之后,且XML头部声明中standalone="yes"

DTD声明要符合DTD语法

在文档中使用DTD定义的根元素时,其根元素的子节点必须要在DTD声明中定义。

03-外部DTD

外部DTD元素在XML文件之外被声明。可以通过指定可能是合法的.dtd文件或有效URL 的系统属性来访问它们。要将其称为外部DTD,XML声明中的独立属性必须设置为no。这意味着声明包括来自外部来源的信息。

XML文档的头部声明设置为

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

外部DTD的语法为

<!DOCTYPE root-element SYSTEM "file-name">

其中file-name是.dtd扩展名的文件

实例:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE address SYSTEM "address.dtd">
<address>
  <name>Tanmay Patil</name>
  <company>TutorialsPoint</company>
  <phone>(011) 123-4567</phone>
</address>

第一行为XML头部声明,注意standalone="no"与内部DTD声明不同

第二行SYSTEM为系统标识符,指向外部文件的位置

01-系统标识符

语法

引用外部文件

<!DOCTYPE name SYSTEM "address.dtd" [...]>

它包含关键字SYSTEM和指向文档位置的URI

02-公共标识符

公共标识符提供了一种定位DTD资源的机制

<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">

它以关键字PUBLIC开始,后跟一个专门的标识符。公共标识符用于标识目录中的条目。公共标识符可以遵循任何格式,但是常用的格式称为正式公共标识符或FPI。

04-声明实体格式

在DTD中进行实体声明时,将使用ENTITY关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。

内部声明实体格式:

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

引用外部实体格式:

<!ENTITY 实体名称 SYSTEM "URI">

0X03-使用PHP解析XML

XML是一种数据传输格式,当PHP接收到的数据就是一段XML的时候,怎么用PHP出来XML数据呢?

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

01-XML解析原理

PHP解析XML共分为3步:

  • 读取XML文档到内存
  • 形成DOM树
  • 由DOM树生成对象并返回

02-SimpleXML类库

xml:image-20220104130353991

image-20220104131136804

simplexml解析:

image-20220104130630993

分析解析后的数据:

object(SimpleXMLElement)#1 (1) { ["man"]=> array(2) { [0]=> object(SimpleXMLElement)#2 (2) { ["name"]=> string(6) "尽兴" ["age"]=> string(2) "36" } [1]=> object(SimpleXMLElement)#3 (2) { ["name"]=> string(6) "太白" ["age"]=> string(2) "55" } } } 

image-20220104131523604

simplexml.php:从xml中提取“尽兴”,simplexml解析生成数组,尽兴的数组下标为0image-20220104130443593

image-20220104130509279

03-遍历XML数据

遍历标签name的内容

foreach循环:

echo $x->man[0]->name;foreach($x->man as $v){   echo $v->name;}

for循环:

$c = count($x->man);for ($i=0;$i<$c;$i++){	echo $x->man[$i]->name;}

image-20220104144703886

image-20220104144715748

04-添加节点

运用PHP里面的方法添加节点

<?php//simple_load_file解析XML文档,返回PHP对象$x = simplexml_load_file('test.xml');//对象中的addChild创建节点并给创建后的节点添加内容$man = $x -> addChild('man');$man->addChild('name','玉帝');$man->addChild('age','999');var_dump($x);//将添加后的对象重新解析成XML文档,写入文件$x->asXML('test.xml');

image-20220104151916880

添加成功

image-20220104152133837

posted @ 2022-01-05 22:19  美式加糖  阅读(581)  评论(2)    收藏  举报