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);
相关推荐
alexhilton1 天前
使用Android Archive进行打包
android·kotlin·android jetpack
badhope1 天前
做了几年安卓开发,这些坑我帮你踩过了
android·android studio
逐光老顽童3 天前
Java 与 Kotlin 混合开发避坑指南:30 个真实案例实录
android·kotlin
爱勇宝3 天前
鸿蒙生态的下半场:开发者不只要能开发,还要能赚钱
android·前端·程序员
Yeyu4 天前
刷新一帧的艺术:invalidate / postInvalidate / postInvalidateOnAnimation全解析
android
潘潘潘4 天前
Android OTA 升级原理和流程介绍
android
plainGeekDev4 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
plainGeekDev4 天前
getter/setter → Kotlin 属性
android·java·kotlin
YXL1111YXL4 天前
Handler 消息回收与协程异步执行的时序陷阱
android
恋猫de小郭4 天前
KMP / CMP 鸿蒙版本 Beta 发布,他有什么特别之处?
android·前端·flutter