XML标记语言

ops/2024/11/8 13:02:40/

最近在学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

<![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:

<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
$q = simplexml_load_file('z.xml');
$w = $q->xpath('/root/man/user');
var_dump($w);
?>

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

相对查找

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

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

使用*匹配

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

条件,匹配查找

//man[age>10]   age为man中的子节点(子标签)

//man[last()] 拿到man节点下的最后一个节点值

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

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

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


http://www.ppmy.cn/ops/131933.html

相关文章

如何在 Java 中使用 Canal 同步 MySQL 数据到 Redis

文章目录 一、引言二、工作原理1. MySQL主备复制原理2. canal 工作原理 三、环境准备1. 安装和配置 MySQL2. 安装和配置 Canal3. 安装和配置 Redis 四、开发 Java 应用1. 添加依赖2. 编写 Canal 客户端代码3. 运行和测试3.1 启动 Canal 服务&#xff1a;3.2 启动 Redis 服务&am…

全星魅-物联网定位终端-北斗定位便携终端-北斗有源终端

在当今快速发展的物流运输行业中&#xff0c;精准定位与实时监控已成为确保货物安全与高效运输的关键因素。为了满足这一需求&#xff0c;QMCZ10作为一款集4G&#xff08;LTE Cat1&#xff09;通讯技术与智能定位功能于一体的终端产品&#xff0c;应运而生。它不仅具备普通定位…

【算法与数据结构】【链表篇】【题1-题5】

题1.从尾到头打印链表 题目&#xff1a;输入一个链表的头结点&#xff0c;从尾到头反过来打印出每个节点的值。链表的定义如下&#xff1a; struct ListNode {int mValue;ListNode *mNext;ListNode *mPrev; }; 1.1 方法一&#xff1a;栈 思路&#xff1a;要反过来打印&…

爬虫-------字体反爬

目录 一、了解什么是字体加密 二. 定位字体位置 三. python处理字体 1. 工具库 2. 字体读取 3. 处理字体 案例1:起点 案例2:字符偏移: 5请求数据 - 发现偏移量 5.4 多套字体替换 套用模板 版本1 版本2 四.项目实战 1. 采集目标 2. 逆向结果 一、了解什么是…

qt QTextCursor详解

1、概述 QTextCursor是Qt框架中用于在QTextDocument或QTextEdit中编辑和导航文本的类。它提供了对文本选择和编辑操作的低级控制&#xff0c;允许插入、删除、修改文本以及改变文本的格式。QTextCursor可以看作是一个在文本中移动的插入点或选择区域&#xff0c;通过它可以执行…

微信小程序uniapp基于Android的流浪动物管理系统 70c3u

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 以往流浪猫狗的救助网站相关信息的管理&#xff0c;都是工作人员手工统计。这种方式不但时效性低&#xff0c;而且需要查…

G1垃圾回收器日志详解

新生代收集 GC pause (G1 Evacuation Pause) (young) -- gc前堆内存分布情况 {Heap before GC invocations1592 (full 4):garbage-first heap total 6291456K, used 5011297K [0x0000000640000000, 0x0000000640206000, 0x00000007c0000000) --表示使用了G1,堆大小&…

25国考照片处理器使用流程图解❗

1、打开“国家公务员局”网站&#xff0c;进入2025公务员专题&#xff0c;找到考生考务入口 2、点击下载地址 3、这几个下载链接都可以 4、下载压缩包 5、解压后先看“使用说明”&#xff0c;再找到“照片处理工具”双击。 6、双击后会进入这样的界面&#xff0c;点击&…