xml基础

xml基础

注:这个只是为了自己能看懂写的,也是为了后续学习xxe漏洞

要求

用来传输和存储数据,语法要求严格,标签必须自定义

语法规则

必须有根节点

头申明可有可无<?xml version=1.0 encoding='utf-8' ?>

成对标签,区分大小写

xml 复制代码
<?xml version='1.0' encoding='utf-8' ?>
<root>
<usr>lbw</usr>
<msg>超级大帅哥</msg>
</root>

特殊字符使用实体转义

复制代码
&lt; <
&gt; >
&amp; &
' '
$quot; "
xml 复制代码
<?xml version='1.0' encoding='utf-8' ?>
<root>
<usr>lbw</usr>
<msg>超级大帅哥</msg>
<mag>1+1 &lt; 3?</mag>
</root>

属性规则

数字字母下划线命名

xml 复制代码
<?xml version='1.0' encoding='utf-8' ?>
<root>
<man>
  <name>金鑫</name>
  <age>21</age>
</man>
<man>
  <name age="123">七七</name>
</man>
</root>
xml 复制代码
<?xml version='1.0' encoding='utf-8' ?>
<root>
<man>
  <name old="11">金鑫</name>
</man>
<man>
  <name age="123">七七</name>
</man>
</root>

强制引用,不需要转义了

XML 复制代码
<?xml version='1.0' encoding='utf-8' ?>
<root>
<man>
  <name old="11"><![CDATA[LFWFELWNF<<<>??<>>>>>>&&&'''''""""""]]></name>
</man>
</root>

字符较少:实体替换

字符较多:<![CDATA[]]>

XML解析原理

php内置了xml解析库

php 复制代码
<?php
//echo file_get_contents("1.xml");
$x=simplexml_load_file("1.xml");
var_dump($x);
echo($x->man[0]->name);

输出

php 复制代码
object(SimpleXMLElement)#1 (1) {
["man"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#2 (2) {
["name"]=>
string(6) "金鑫"
["age"]=>
string(2) "11"
}
[1]=>
object(SimpleXMLElement)#3 (2) {
["name"]=>
string(6) "七七"
["age"]=>
string(3) "131"
}
}
}
金鑫

读取xml文档到内存,形成dom树,由dom树生成对象并返回

看注释

php 复制代码
object(SimpleXMLElement)#1 (1) {//调用simplexml_load_file函数,解析XML生成的对象
["man"]=>//php将xml节点以属性的形式存放
array(2) {
[0]=>//内容如果有多条,以数组形式存放
object(SimpleXMLElement)#2 (2) {
["name"]=>//数组的值就是解析后的节点名字和内容,以对象属性的形式存放
string(6) "金鑫"
["age"]=>
string(2) "11"
}
[1]=>
object(SimpleXMLElement)#3 (2) {
["name"]=>
string(6) "七七"
["age"]=>
string(3) "131"
}
}
}

遍历xml

php 复制代码
<?php
//echo file_get_contents("1.xml");
$x=simplexml_load_file("1.xml");
foreach($x->student->man as $v)
{
echo $v->name."<br>";
}

添加节点

php 复制代码
<?php
//echo file_get_contents("1.xml");
$x=simplexml_load_file("1.xml");
foreach($x->student->man as $v)
{
echo $v->name."<br>";
}
$man=$x->student->addChild("man");
$man->addChild("name","adnal");
$man->addChild("age","17");
//var_dump($x);

$teacher=$x->addChild("teacher");

$man1=$teacher->addChild("man");
$man1->addChild("name","李老师");
$man1->addChild("age","217");

$man2=$teacher->addChild("man");
$man2->addChild("name","wang老师");
$man2->addChild("age","17111");

var_dump($x);

$x->asXML("1.xml");//保存到文件里,直接修改文件了

两种加载方式

1、simplexml_load_file($xml_addr)接收xml文件数据/地址:x/x/1.xml
2、simplexml_load_string($xml_str)接受xml字符串:

XPath

专门对xml文档遍历

xpath得到一个数组,数组里的值是一个对象

php 复制代码
<?php
$x=simplexml_load_file("1.xml");
$d=$x->xpath('/root/student/man/name');
//绝对路径
foreach ($d as $key)
{
echo $key."<br>";
}
php 复制代码
<?php
$x=simplexml_load_file("1.xml");
//$d=$x->xpath('/root/student/man/name');
$d=$x->xpath('//name');//相对路径

foreach ($d as $key)
{
echo $key."<br>";
}
php 复制代码
<?php
$x=simplexml_load_file("1.xml");
//$d=$x->xpath('/root/student/man/name');
//$d=$x->xpath('//name');
$d=$x->xpath('//man/*');// * 匹配man下所有的值

foreach ($d as $key)
{
echo $key."<br>";
}
php 复制代码
<?php
$x=simplexml_load_file("1.xml");
$d=$x->xpath('//man[age<120]');// 找age<120下所有的值
var_dump($d);
php 复制代码
<?php
$x=simplexml_load_file("1.xml");
$d=$x->xpath('//man[@msg]');// 指定属性查找
echo "<br>";
var_dump($d);
相关推荐
私人珍藏库16 小时前
【Android】Soul v5.86.0 内置模块版
android·app·工具·软件·多功能
千里马学框架17 小时前
aosp新增窗口层级 Type 完整实现方案(有源码)-wms需求和面试题
android·智能手机·架构·wms·aaos·车机
峥嵘life1 天前
Android 蓝牙设备连接广播详解-2026
android·python·学习
MusingByte1 天前
别再裸用 Claude Code 了!安卓开发者必装 13 个官方推荐插件,效率翻 3 倍省 70% token
android
_李小白1 天前
【android opencv学习笔记】Day 29: 滤波算法之Sobel 边缘检测
android·opencv·学习
Dxy12393102161 天前
Python 操作 MySQL 事务:从入门到避坑
android·python·mysql
峥嵘life1 天前
Android getprop 属性限制详解:User 版本属性获取问题分析
android·开发语言·python·学习
一航jason1 天前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android·插件化·组件化·换肤
李斯维1 天前
Jetpack 可观察数据容器 LiveData 的入门与基础使用
android·android jetpack
问心无愧05131 天前
ctf show web入门261
android·前端·笔记