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);
相关推荐
疯华整猫4 分钟前
我用 Trae 把 Android 内存账重算了一遍
android·性能优化·源码
TimeFine2 小时前
AI 编程工作流的设计:从人工判断到 AI裁判
android·ai编程
阿杰m2 小时前
Android源码第四章:Android 系统启动——App 的第一行代码从哪来?
android
疯华整猫6 小时前
混淆起初根本不是为了防破解:我用 Trae 把 Android 混淆这二十来年重跑了一遍
android·人工智能·计算机视觉
Carson带你学Android7 小时前
AI时代,你的 App 会被 Agent 这三种方式调用
android·ai编程
恋猫de小郭8 小时前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
好的佩奇1 天前
Dart 之扩展方法
android·flutter·dart
三少爷的鞋1 天前
换个思路理解:非阻塞挂起
android
好的佩奇1 天前
蓝牙之经典蓝牙
android·flutter·蓝牙
传奇开心果编程1 天前
【Flutter踩坑排雷】第19课:路由硬编码坑|字符串路由书写错误,页面跳转失败排查
android·flutter·ios·移动开发·跨平台·ui框架·声明式ui