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);
相关推荐
星释7 分钟前
鸿蒙智能体开发实战:34.鸿蒙壁纸大师 - 提示词工程与优化
android·华为·harmonyos·鸿蒙
blanks202036 分钟前
android 编译问题记录
android
bobuddy2 小时前
平台总线(platform bus)
android
plainGeekDev2 小时前
libs 目录 → Gradle 依赖管理
android·java·kotlin
帅次3 小时前
Android 高级工程师面试:Flutter Widget 体系 近1年高频追问 20 题
android·flutter·面试·element·widget·setstate·renderobject
帅次3 小时前
Android 高级工程师面试:Jetpack 核心 近1年高频追问 20 题
android·面试·协程·jetpack·stateflow·lifecycle
爱笑鱼4 小时前
Handler(四):Handler 卡顿怎么定位?从 Slow delivery 到 Slow dispatch
android
九皇叔叔4 小时前
RHEL9.8 配置本地镜像仓库
android·java·缓存
私人珍藏库5 小时前
[Android] 聊天记录微备份 -聊天记录备份+本地数据备份
android·人工智能·app·软件·多功能
AI产品实战5 小时前
Gradle打包生成dependencies.xml详解
xml·java·gradle