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);
相关推荐
龙之叶2 小时前
【Android Monkey源码解析四】- 异常捕获/页面控制
android·windows·adb·monkey
_F_y4 小时前
MySQL表的操作
android·数据库·mysql
yngsqq4 小时前
AndroidStudio汉化步骤
android
HyEISN5 小时前
Android 9 开启远程adb
android·adb
2501_944526425 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 抽牌游戏实现
android·开发语言·python·flutter·游戏
大大祥6 小时前
穿山甲广告sdk接入
android·kotlin·音视频·视频播放器·广告sdk
2501_944526426 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 笑话生成器实现
android·javascript·python·flutter·游戏
2501_944526427 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 21点游戏实现
android·javascript·flutter·游戏·harmonyos
Alex老夫子7 小时前
android room数据库增加字段注意事项
android·数据库