XML标记语言

最近在学XXE-XML外部实体注入漏洞时候,浅浅学习了一下XML,谨做此学习笔记。


目录

一:XML概述

二:XML语法

XML中的CDATA

三:使用PHP解析XML文档

添加节点

四:Xpath语言

绝对查找

相对查找

使用*匹配

条件,匹配查找


一:XML概述

XML:可扩展性标记语言

(HTML是超文本标记语言,XML和HTML极为相似)

下面是一段标准的XML数据格式:

(不同浏览器上展示形式可能不同)

XML数据格式最主要的功能就是数据传输

XML也可以用作配置文件,如:config.xml pom.xml

XML也可以存储数据,充当小型数据库

XML被发明的目的是传输和存储数据,而不是展示数据(HTML是展示数据)

XML标签必须自定义,必须有一个根节点<root></root>(不是root也行,也可以自定义),而且它是W3C推举的数据传输格式。


二:XML语法

XML语法要求极其严格:

1.必须有根节点。

2.XML的头声明:可有可无,但是建议写上。

<?xml version="1.0" encoding="utf-8"?>

3.所有标签都必须成对出现,没有HTML中的单标签。

4.大小写敏感。

5.标签不能交叉,XML的注释和HTML是一样的。

6.特殊字符需要实体转义:

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

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

命名规则:数字字母下划线,数字不能开头;

还有,在解析数据时,属性会带来额外的解析代码(多了一步,比较麻烦);所以属性就是鸡肋(食之无肉,弃之有味);

XML中的CDATA

当有一段文本包含很多特殊字符时候,这个时候一个一个转成实体过于麻烦,所以我们可以使用XML中的CDATA

XML 复制代码
<![CDATA[这里是文本内容]]>

三:使用PHP解析XML文档

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

通过使用simplexml_load_file() 这个函数来解析XML文档,返回PHP对象:

会返回一个数组形式(键值对)的冬冬:(根节点root是不解析的)

object(SimpleXMLElement)#1 (3)

{ "id"=> string(3) "num" "user"=> string(5) "he11o" "qw"=> string(9) "good girl" }

并且可以通过echo $q->user 来获取到对应的字符串

PHP 解析XML共分为3步:

  1. 读取文档到内存
  2. 形成 DOM树
  3. 由 DOM树生成对象并返回.

解析其中,如果有相同的标签名,就会转为数组,XML中的标签作为了PHP中的属性,XML标签中的内容作为PHP属性值。

这个其实自己试试理解更为深刻。。

XML:

XML 复制代码
<root>
<man>
<id>num</id>
<user>he11o</user>
<qw>good girl</qw>
</man>
</root>

PHP返回到页面:

object(SimpleXMLElement)#1 (1)

{ "man"=> object(SimpleXMLElement)#2 (3)

{

"id"=> string(3) "num"

"user"=> string(5) "he11o"

"qw"=> string(9) "good girl"

}

}

可以使用for循环或者foreach来遍历XML数据。

添加节点

首先还是拿simplexml_load_file() 获取到XML文档

然后可以用addChild()函数给获取到的 $q 来添加子节点,看图:

添加节点:

最后还有一个asXML的操作,也就是把这个修改给加到XML文档中去。

总体来说,就是创建一个变量获取(接收)XML文档,然后修改,再把这个变量给返回到XML文档中去。


四:Xpath语言

Xpath:他是专门用来查找XML数据内容的一门语言,对XML元素以及属性进行遍历。

比如说要想找到一个XML文档中的所有user属性的值,直接用Xpath函数:

xpath('路径')

绝对查找

(这里是 / 开头的绝对查找)

php 复制代码
<?php
$q = simplexml_load_file('z.xml');
$w = $q->xpath('/root/man/user');
var_dump($w);
?>

Xpath查找后仍然返回的是数组,每一个值仍是一个对象。

相对查找

w = q->xpath('//user'); 注意这里是双杠

意为寻找XML文档里所有user属性的值

使用*匹配

比如: //man/* 意为man下面的所有节点都找到

条件,匹配查找

//manage\>10 age为man中的子节点(子标签)

//manlast() 拿到man节点下的最后一个节点值

//man@msg 查找man节点下的有msg属性的所有节点

总结如有不当之处,欢迎大家批评指正!

ヾ(•ω•`)o ヾ(•ω•`)o

相关推荐
斯特凡今天也很帅1 天前
xml页面可以打开,不报错,但是显示数据的地方也不显示,我是怎么解决的
xml·vue.js
前网易架构师-高司机2 天前
带标注的21种中药材识别数据集,识别率73.8%数据集,2237张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·中药·药材·中草药
snow@li2 天前
Java:pom.xml全景深度分析 / 机制、标签、依赖、打包、生产避坑全解 / 工程基石
xml·java·开发语言
田里的水稻2 天前
EP_XML\JSON配置文件和YAML
xml·运维·人工智能·机器人·自动驾驶·json
xiangji3 天前
开源完美模块组件化可扩展的Xml解析器Hand.ParseXml
xml·模块化·组件化·可扩展
我命由我123454 天前
Android 构建项目问题:XML 片段出错,com.ctc.wstx.exc.WstxUnexpectedCharException
android·xml·android studio·android jetpack·android-studio·android runtime
PixelBai6 天前
JSON转XML使用教程:从入门到精通
xml·json
脑子运行超载8 天前
Jackson处理和mybatis的xml转换问题
xml·jackson·mybatis·javatype
tianyuanwo24 天前
深入解析 RISC-V 虚拟化中的 UEFI 固件配置:从 XML 到 NVRAM 的生命周期管理
xml·linux·risc-v
糖果店的幽灵1 个月前
软件测试接口测试从入门到精通:常见接口类型与数据格式
xml·软件测试·json·接口测试·数据格式