PHP XML操作的各种方法解析(比较详细)


Posted in PHP onJune 17, 2010

XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据。在实际应用中,一些简单的、安全性较低的数据往往使用 XML文件的格式进行存储。这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用 XML的优越性降低程序的编写难度。
PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序。本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍。
1 XML简介
XML是“可扩展性标识语言(eXtensible Markup Language)”的缩写,是一种类似于 HTML的标记性语言。但是与 HTML不同,XML主要用于描述数据和存放数据,而 HTML主要用于显示数据。
XML是一种“元标记”语言,开发者可以根据自己的需要创建标记的名称。例如,下面的 XML代码可以用来描述一条留言。

<thread> 

<title>Welcome</title> 

<author>Simon</author> 

<content>Welcome to XML guestbook!!</content> 

</thread>

其中,<thread>与</thread>标签标记了这是一段留言。在留言中有标题、作者、内容,完整的表述了一条留言信息。
在一个 XML文件的顶部,通常使用<?xml version=”1.0″?>来标识 XML数据的开始和 XML数据使用标准的版本信息。在浏览器中访问 XML文件可以看到层次分明的 XML数据信息,如图 1所示。
PHP XML操作的各种方法解析(比较详细) 
XML的发展非常迅速,近些年来很多软件开发商都开始采用 XML的开发标准进行应用程序的开发。并且,很多新兴技术都架构在 XML数据之上。这意味着 XML将与 HTML一样成为 Web技术不可或缺的一部分。
2 简单的 XML操作
在实际应用中,PHP与 XML的交互操作应用非常广泛。SimpleXML组件是 PHP5新增加的一个简
单的 XML操作组件,与传统的 XML组件相比,SimpleXML组件的使用非常简单。本节将对使用
SimpleXML组件操作 XML的方法做一下详细介绍。
2.1 创建一个 SimpleXML对象
SimpleXML对象是用来临时存储 XML数据的临时变量,对 XML进行的操作都是通过操作 SimpleXML对象来完成的。SimpleXML组件提供了两种创建 SimpleXML对象的方法。第一种方法是使用 simplexml_load_string函数读取一个字符串型变量中的 XML数据来完成创建的,其语法格式如下所示。
simplexml_load_string(string data)
这里的 data变量用于存储 XML数据。以下代码使用 simplexml_load_string函数创建了一个 SimpleXML对象
<?php 

$data = <<<XML //定义 XML数据 

<?xml version='1.0′?> 

<departs> 

<depart> 

<name>production support</name> 

<employees> 

<employee> 

<serial_no>100001</serial_no> 

<name>Simon</name> 

<age>24</age> 

<birthday>1982-11-06</birthday> 

<salary>5000.00</salary> 

<bonus>1000.00</bonus> 

</employee> 

<employee> 

<serial_no>100002</serial_no> 

<name>Elaine</name> 

<age>24</age> 

<birthday>1982-01-01</birthday> 

<salary>6000.00</salary> 

<bonus>2000.00</bonus> 

</employee> 

</employees> 

</depart> 

<depart> 

<name>testing center</name> 

<employees> 

<employee> 

<serial_no>110001</serial_no> 

<name>Helen</name> 

<age>23</age> 

<birthday>1983-07-21</birthday> 

<salary>5000.00</salary> 

<bonus>1000.00</bonus> 

</employee> 

</employees> 

</depart> 

</departs> 

XML; 

$xml = simplexml_load_string($data); //创建 SimpleXML对象 

print_r($xml); //输出 XML 

?>

在上面的例子中,$data变量存储了一段 XML数据。 simplexml_load_string函数将变量$data转化成 SimpleXML对象。通过 print_r函数的输出可以看出该对象的结构,运行结果如下所示。
SimpleXMLElement Object 

( 

[depart] => Array 

( 

[0] => SimpleXMLElement Object 

( 

[name] => production support 

[employees] => SimpleXMLElement Object 

( [employee] => Array ( 

[0] => SimpleXMLElement Object 

( [serial_no] => 100001 

[name] => Simon 

[age] => 24 

[birthday] => 1982-11-06 

[salary] => 5000.00 

[bonus] => 1000.00 

) 

[1] => SimpleXMLElement Object 

( [serial_no] => 100002 

[name] => Elaine 

[age] => 24 

[birthday] => 1982-01-01 

[salary] => 6000.00 

[bonus] => 2000.00 

) 

) 

) 

) 

[1] => SimpleXMLElement Object 

( 

[name] => testing center 

[employees] => SimpleXMLElement Object 

( 

[employee] => SimpleXMLElement Object 

( 

[serial_no] => 110001 

[name] => Helen 

[age] => 23 

[birthday] => 1983-07-21 

[salary] => 5000.00 

[bonus] => 1000.00 

) 

) 

) 

) 

)

从输出结果可以看出,SimpleXML对象的结构与 XML数据的格式完全相同。
第二种方法是使用 simplexml_load_flie函数读取一个 XML文件来完成创建的,其语法格式如下所示。
simplexml_load_file(string filename)
这里的 filename变量是用于存储 XML数据文件的文件名及其所在路径。以下代码使用 simplexml_load_file函数来创建了一个 SimpleXML对象。
<?php 

$xml = simplexml_load_file('example.xml'); //创建 SimpleXML对象 

print_r($xml); //输出 XML 

?>

其中,example.xml存储的数据与上面的$data完全相同,运行结果也与上面完全相同。
上面两种方法实现了同样的功能,其区别就在于 XML的数据源不同。如果 XML的数据源在 PHP脚本文件中,则需要使用 simplexml_load_string来进行创建。如果 XML的数据源在一个单独的 XML文件中,则需要使用 simplexml_load_file来进行创建。
2.2 读取 SimpleXML对象中的 XML数据
前面介绍了使用 print_r函数来读取 SimpleXML对象中的数据,其返回结果与数组的结构类似。显然,这种显示方式在实际应用中是不可取的。在这里将介绍其他的几种读取 SimpleXML对象中 XML数据的方法。
1.var_dump函数显示对象详细信息
var_dump函数可以用于显示 SimpleXML对象的详细信息,与 print_r函数相比,var_dump函数显示的信息更为完整,其语法如下所示。
void var_dump(object1, object2 … )
以下代码使用 var_dump函数输出了上面例子中对象的详细信息。
<?php $xml = simplexml_load_file('example.xml'); //创建 SimpleXML对象 var_dump($xml); //输出 XML ?>

运行结果如下所示。
object(SimpleXMLElement)#1 (1) { ["depart"]=> array(2) { 

[0]=> 

object(SimpleXMLElement)#2 (2) { 

["name"]=> 

string(18) “production support” 

["employees"]=> 

object(SimpleXMLElement)#4 (1) { 

["employee"]=> 

array(2) { 

[0]=> 

object(SimpleXMLElement)#5 (6) { 

["serial_no"]=> 

string(6) “100001″ 

["name"]=> 

string(5) “Simon” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-11-06″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

} 

[1]=> 

object(SimpleXMLElement)#6 (6) { 

["serial_no"]=> 

string(6) “100002″ 

["name"]=> 

string(6) “Elaine” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-01-01″ 

["salary"]=> 

string(7) “6000.00″ 

["bonus"]=> 

string(7) “2000.00″ 

} 

} 

} 

} 

[1]=> 

object(SimpleXMLElement)#3 (2) { 

["name"]=> 

string(14) “testing center” 

["employees"]=> 

object(SimpleXMLElement)#7 (1) { 

["employee"]=> 

object(SimpleXMLElement)#8 (6) { 

["serial_no"]=> 

string(6) “110001″ 

["name"]=> 

string(5) “Helen” 

["age"]=> 

string(2) “23″ 

["birthday"]=> 

string(10) “1983-07-21″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

}}}}}

与前面 print_r输出的结果相比较,var_dump函数的输出结果的结构更为严谨,并且将对象中的每一个属性的数据类型均作出分析。在实际应用中,var_dump函数往往用于程序调试时的对象检测。
2.读取 XML数据中的标签
与操作数组类型的变量类似,读取 XML也可以通过类似的方法来完成。例如,如果需要读取上面 XML数据中每一个“ depart”标签下的“name”属性,可以通过使用 foreach函数来完成,如以下代码
所示。
<?php $xml = simplexml_load_file('example.xml'); foreach($xml->depart as $a) 

{ 

echo “$a->name <BR>”; 

} 

?>

运行结果如下所示。
production support
testing center
//读取 XML文件 //循环读取 XML数据中的每一个 depart标签
//输出其中的 name属性
也可以使用方括号“ []”来直接读取 XML数据中指定的标签。以下代码输出了上面 XML数据中的第一个“depart”标签的“name”属性。
<?php 

$xml = simplexml_load_file('example.xml'); //读取 XML文件 

echo $xml->depart->name[0]; //输出节点 

?>

运行结果如下所示。
production support
对于一个标签下的所有子标签,SimpleXML组件提供了 children方法进行读取。例如,对于上面的 XML数据中的“ depart”标签,其下包括两个子标签:“ name”和“employees”。以下代码实现了对第一个“depart”标签下的子标签的读取。
<?php 

$xml = simplexml_load_file('example.xml'); 

foreach ($xml->depart->children() as $depart) //循环读取 depart标签下的子标签 

{ 

var_dump($depart); //输出标签的 XML数据 

} 

?>

运行结果如下所示。
object(SimpleXMLElement)#3 (1) { 

[0]=> 

string(18) “production support” 

} 

object(SimpleXMLElement)#5 (1) { 

["employee"]=> 

array(2) { 

[0]=> 

object(SimpleXMLElement)#3 (6) { 

["serial_no"]=> 

string(6) “100001″ 

["name"]=> 

string(5) “Simon” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-11-06″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

} 

[1]=> 

object(SimpleXMLElement)#6 (6) { 

["serial_no"]=> 

string(6) “100002″ 

["name"]=> 

string(6) “Elaine” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-01-01″ 

["salary"]=> 

string(7) “6000.00″ 

["bonus"]=> 

string(7) “2000.00″ 

} 

} 

}

可以看出,使用 children方法后,所有的子标签均被当作一个新的 XML文件进行处理。
3.基于 XML数据路径的查询
SimpleXML组件提供了一种基于 XML数据路径的查询方法。 XML数据路径即从 XML的根到某一个标签所经过的全部标签。这种路径使用斜线“ /”隔开标签名。例如,对于上面的 XML数据,要查询所有的标签“name”中的值,从根开始要经过 departs、depart、employees和 employee标签,则其路径
为“/departs/depart/employees/employee/name”。 SimpleXML组件使用 xpath方法来解析路径,其语法格式如下所示。
xpath(string path)
其中的 path为路径。该方法返回了一个包含有所有要查询标签值的数组。以下代码查询了上面 XML数据中的所有 name标签。
<?php 

$xml = simplexml_load_file('example.xml'); //读取 XML文件 

$result = $xml->xpath('/departs/depart/employees/employee/name'); //定义节点 

var_dump($result); //输出节点 

?>

运行结果如下所示。
array(3) { 

[0]=> object(SimpleXMLElement)#2 (1) { 

[0]=> string(5) “Simon” 

} 

[1]=> object(SimpleXMLElement)#3 (1) { 

[0]=> string(6) “Elaine” 

} 

[2]=> object(SimpleXMLElement)#4 (1) { 

[0]=> string(5) “Helen” 

} 

}

可以看出,所有的 name标签均被查询出来。
2.3 XML数据的修改
对于 XML数据的修改与读取 XML数据中的标签方法类似。即通过直接修改 SimpleXML对象中的标签的值来实现。以下代码实现了对上面 XML数据中第一个“ depart”标签的“ name”子标签的修改。
<?php 

$xml = simplexml_load_file('example.xml'); //读取 XML 

$xml->depart->name[0] = “Human Resource”; //修改节点 

?>

修改后,并不会对 XML文件有任何影响。但是,在程序中,对于 SimpleXML对象的读取将使用修改过的值。
2.4 标准化 XML数据
SimpleXML还提供了一种标准化 XML数据的方法 asXML。asXML方法可以有效的将 SimpleXML对象中的内容按照 XML 1.0标准进行重新编排并以字符串的数据类型返回。以下代码实现了对上面 XML数据的标准化。
<?php 

$xml = simplexml_load_file('example.xml'); //读取 XML数据 

echo $xml->asXML(); //标准化 XML数据 

?>

2.5 XML数据的存储
将 SimpleXML对象中的 XML数据存储到一个 XML文件的方法非常简单,即将 asXML方法的返回结果输出到一个文件中即可。以下代码首先将 XML文件中的 depart name进行了修改,然后将修改过的 XML数据输出到另一个 XML文件。
<?php 

$xml = simplexml_load_file('example.xml'); //读取 XML数据 

$newxml = $xml->asXML(); //标准化 XML数据 

$fp = fopen(”newxml.xml”, “w”); //打开要写入 XML数据的文件 

fwrite($fp, $newxml); //写入 XML数据 

fclose($fp); //关闭文件 

?>

代码运行后,可以看到在 newxml.xml文件中的 XML数据如下所示。
可以看出,对于 XML文件的修改已经保存到输出文件中了。
3 XML文档的动态创建
在实际应用中,时而会需要动态生成 XML文档的操作。前面介绍的 SimpleXML组件并不提供创建 XML文档的方法。因此,如果需要动态创建 XML文档,往往使用 DOM组件进行创建。 DOM是文档对象模型 Document Object Model的缩写, DOM组件提供了对 XML文档的树型解析模式。以下代码使用 DOM组件创建了一个 XML文档。
<?php 

//创建一个新的 DOM文档 

$dom = new DomDocument(); 

//在根节点创建 departs标签 

$departs = $dom->createElement('departs'); 

$dom->appendChild($departs); 

//在 departs标签下创建 depart子标签 

$depart = $dom->createElement('depart'); 

$departs->appendChild($depart); 

//在 depart标签下创建 employees子标签 

$employees = $dom->createElement('employees'); 

$depart->appendChild($employees); 

//在 employees标签下创建 employee子标签 

$employee = $dom->createElement('employee'); 

$employees->appendChild($employee); 

//在 employee标签下创建 serial_no子标签 

$serial_no = $dom->createElement('serial_no'); 

$employee->appendChild($serial_no); 

//为 serial_no标签添加值节点 100001 

$serial_no_value = $dom->createTextNode('100001′); 

$serial_no->appendChild($serial_no_value); 

//输出 XML数据 

echo $dom->saveXML(); 

?> 

输出结果如下所示。 

<?xml version=”1.0″?> 

<departs> 

<depart> 

<employees> 

<employee> 

<serial_no>100001</serial_no> 

</employee> 

</employees> 

</depart> 

</departs>

DOM组件除了可以用来动态创建 XML文档外,还可以用来读取 XML文件。以下代码实现了对前
面 XML文件的读取。
<?php 

$dom = new DomDocument(); //创建 DOM对象 

$dom->load('example.xml'); //读取 XML文件 

$root = $dom->documentElement; //获取 XML数据的根 

read_child($root); //调用 read_child函数读取根对象 

function read_child($node) 

{ 

$children = $node->childNodes; //获得$node的所有子节点 

foreach($children as $e) //循环读取每一个子节点 

{ 

if($e->nodeType == XML_TEXT_NODE) //如果子节点为文本型则输出 

{ 

echo $e->nodeValue.”<BR>”; 

} 

else if($e->nodeType == XML_ELEMENT_NODE) //如果子节点为节点对象,则调用函数处理 

{ 

read_child($e); 

} 

} 

} 

?>

运行结果如下所示。
引用 

production support 

100001 

Simon 

24 

1982-11-06 

5000.00 

1000.00 

100002 

Elaine 

24 

1982-01-01 

6000.00 

2000.00 

testing center 

110001 

Helen 

23 

1983-07-21 

5000.00 

1000.00

上面的例子使用了递归的方式对 XML数据进行了处理,实现了输出 XML数据中的所有文本型标签的功能。
4 XML应用实例——留言本
前面介绍了 XML的基本操作,本节将以设计一个 XML留言本为例来详细说明在实际应用中如何实现 PHP与 XML数据的交互操作。
4.1 XML文件结构设计
XML文件用于存储 XML数据,也就是留言本中的留言。这里,对于每条留言,在 XML数据中主要包括三项内容:留言标题、留言者姓名、留言内容。因此,将 XML文件的格式设计如下。
<?xml version=”1.0″?> 

<threads> 

<thread> 

<title>这里是留言的标题</title> 

<author>这里是留言者</author> 

<content>这里是留言内容</content> 

</thread> 

</threads>

4.2 提交页面的编写
提交留言页面由两个页面组成。一个是让访问者用来书写留言的表单的 HTML文件,一个是用来处理访问者输入的 PHP脚本。表单的 HTML代码如下所示。
<html> 

<head> 

<title>发表新的留言</title> 

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 

</head> 

<body> 

<H1><p align=”center”>发表新的留言</p></H1> 

<form name=”form1″ method=”post” action=”Post.php”> 

<table width=”500″ border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″> 

<tr> 

<td>标题</td> 

<td><input name=”title” type=”text” id=”title” size=”50″></td> 

</tr> 

<tr> 

<td>作者</td> 

<td><input name=”author” type=”text” id=”author” size=”20″></td> 

</tr> 

<tr> 

<td>内容</td> 

<td><textarea name=”content” cols=”50″ rows=”10″ id=”content”></textarea></td> 

</tr> 

</table> 

<p align=”center”> 

<input type=”submit” value=”Submit”> 

<input type=”reset” value=”Reset”> 

</p> 

</form> 

</body> 

</html>

对于用来处理用户输入的 PHP脚本,其基本逻辑是首先创建一个 DOM对象,然后读取 XML文件中的 XML数据,接下来在 XML对象上创建新的节点并将用户的输入储存起来,最后将 XML数据输出到原来的 XML文件中。具体实现代码如下所示。
<?php 

$guestbook = new DomDocument(); //创建一个新的 DOM对象 

$guestbook->load('DB/guestbook.xml'); //读取 XML数据 

$threads = $guestbook->documentElement; //获得 XML结构的根 

//创建一个新 thread节点 

$thread = $guestbook->createElement('thread'); 

$threads->appendChild($thread); 

//在新的 thread节点上创建 title标签 

$title = $guestbook->createElement('title'); 

$title->appendChild($guestbook->createTextNode($_POST['title'])); 

$thread->appendChild($title); 

//在新的 thread节点上创建 author标签 

$author = $guestbook->createElement('author'); 

$author->appendChild($guestbook->createTextNode($_POST['author'])); 

$thread->appendChild($author); 

//在新的 thread节点上创建 content标签 

$content = $guestbook->createElement('content'); 

$content->appendChild($guestbook->createTextNode($_POST['content'])); 

$thread->appendChild($content); 

//将 XML数据写入文件 

$fp = fopen(”DB/guestbook.xml”, “w”); 

if(fwrite($fp, $guestbook->saveXML())) 

echo “留言提交成功”; 

else 

echo “留言提交失败”; 

fclose($fp); 

?>

在浏览器中运行上述 HTML文件并填写适当的留言内容,如图 2所示。
PHP XML操作的各种方法解析(比较详细) 
图 2 发表新留言界面
单击【Submit】按钮后,XML文件中的内容如下所示。
可以看到 XML文件中已经将留言存储起来了。
4.3 显示页面的编写
显示页面可以使用前面介绍的 SimpleXML组件很容易的实现,具体实现代码如下所示。
<?php 

//打开用于存储留言的 XML文件 

$guestbook = simplexml_load_file('DB/guestbook.xml'); 

foreach($guestbook->thread as $th) //循环读取 XML数据中的每一个 thread标签 

{ 

echo “<B>标题:</B>”.$th->title.”<BR>”; 

echo “<B>作者:</B>”.$th->author.”<BR>”; 

echo “<B>内容:</B><PRE>”.$th->content.”</PRE>”; 

echo “<HR>”; 

} 

?>

在浏览器中查看运行结果如图 3所示。
PHP XML操作的各种方法解析(比较详细) 
PHP 相关文章推荐
php pack与unpack 摸板字符字符含义
Oct 29 PHP
PHP函数常用用法小结
Feb 08 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
Apr 13 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 PHP
PHP操作xml代码
Jun 17 #PHP
PHP XML error parsing SOAP payload on line 1
Jun 17 #PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 #PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 #PHP
PHP迅雷、快车、旋风下载专用链转换代码
Jun 15 #PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 #PHP
joomla内置的表单验证功能使用方法
Jun 11 #PHP
You might like
PHP HTML代码串截取代码
2008/12/29 PHP
php 批量添加多行文本框textarea一行一个
2014/06/03 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
基于python实现高速视频传输程序
2019/05/05 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python 操作 MySQL数据库
2020/09/18 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
机电专业大学生求职信
2013/10/04 职场文书
运动会班级口号
2014/06/09 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
2014年护理部工作总结
2014/11/14 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
公司人事管理制度
2015/08/05 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers