xml基础
注:这个只是为了自己能看懂写的,也是为了后续学习xxe漏洞
要求
用来传输和存储数据,语法要求严格,标签必须自定义
语法规则
必须有根节点
头申明可有可无
<?xml version=1.0 encoding='utf-8' ?>成对标签,区分大小写
xml<?xml version='1.0' encoding='utf-8' ?> <root> <usr>lbw</usr> <msg>超级大帅哥</msg> </root>特殊字符使用实体转义
< < > > & & ' ' $quot; "
xml<?xml version='1.0' encoding='utf-8' ?> <root> <usr>lbw</usr> <msg>超级大帅哥</msg> <mag>1+1 < 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);输出
phpobject(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树生成对象并返回
看注释
phpobject(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);