当前位置:  开发笔记 > 编程语言 > 正文

php操作xml详解

XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据。在实际应用中,一些简单的、安全性较低的数据往往使用XML文件的格式进行存储。这样做的好处一方面可以通过减少与数据库的交互性操作提高读..."/> XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据。在实际应用中,一些简单的、安全性较低的数据往往使用 XML文件的格式进行存储。这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用 XML的优越性降低程序的编写难度。 
PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序。本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍。 
1 XML简介 
XML是“可扩展性标识语言(eXtensible Markup Language)”的缩写,是一种类似于 HTML的标记性语言。但是与 HTML不同,XML主要用于描述数据和存放数据,而 HTML主要用于显示数据。 
XML是一种“元标记”语言,开发者可以根据自己的需要创建标记的名称。例如,下面的 XML代码可以用来描述一条留言。 
 
 
代码如下:
 
 
Simon 
Welcome to XML guestbook!! 
 
 
其中,标签标记了这是一段留言。在留言中有标题、作者、内容,完整的表述了一条留言信息。 
在一个 XML文件的顶部,通常使用来标识 XML数据的开始和 XML数据使用标准的版本信息。在浏览器中访问 XML文件可以看到层次分明的 XML数据信息,如图 1所示。 
 
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对象 
代码如下:
$data = <<
 
 
 
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 = 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对象。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //创建 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函数输出了上面例子中对象的详细信息。 
代码如下:
 
 
运行结果如下所示。 
代码如下:
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函数来完成,如以下代码 
所示。 
代码如下:
depart as $a) 
echo “$a->name
”; 
?> 
 
运行结果如下所示。 
production support 
testing center 
//读取 XML文件 //循环读取 XML数据中的每一个 depart标签 
//输出其中的 name属性 
也可以使用方括号“ []”来直接读取 XML数据中指定的标签。以下代码输出了上面 XML数据中的第一个“depart”标签的“name”属性。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML文件 
echo $xml->depart->name[0]; //输出节点 
?> 
 
运行结果如下所示。 
production support 
对于一个标签下的所有子标签,SimpleXML组件提供了 children方法进行读取。例如,对于上面的 XML数据中的“ depart”标签,其下包括两个子标签:“ name”和“employees”。以下代码实现了对第一个“depart”标签下的子标签的读取。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); 
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标签。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML文件 
$result = $xml->xpath(&#39;/departs/depart/employees/employee/name&#39;); //定义节点 
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”子标签的修改。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML 
$xml->depart->name[0] = “Human Resource”; //修改节点 
?> 
 
修改后,并不会对 XML文件有任何影响。但是,在程序中,对于 SimpleXML对象的读取将使用修改过的值。 
2.4 标准化 XML数据 
SimpleXML还提供了一种标准化 XML数据的方法 asXML。asXML方法可以有效的将 SimpleXML对象中的内容按照 XML 1.0标准进行重新编排并以字符串的数据类型返回。以下代码实现了对上面 XML数据的标准化。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML数据 
echo $xml->asXML(); //标准化 XML数据 
?> 
 
2.5 XML数据的存储 
将 SimpleXML对象中的 XML数据存储到一个 XML文件的方法非常简单,即将 asXML方法的返回结果输出到一个文件中即可。以下代码首先将 XML文件中的 depart name进行了修改,然后将修改过的 XML数据输出到另一个 XML文件。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 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文档。 
 
代码如下:
//创建一个新的 DOM文档 
$dom = new DomDocument(); 
//在根节点创建 departs标签 
$departs = $dom->createElement(&#39;departs&#39;); 
$dom->appendChild($departs); 
//在 departs标签下创建 depart子标签 
$depart = $dom->createElement(&#39;depart&#39;); 
$departs->appendChild($depart); 
//在 depart标签下创建 employees子标签 
$employees = $dom->createElement(&#39;employees&#39;); 
$depart->appendChild($employees); 
//在 employees标签下创建 employee子标签 
$employee = $dom->createElement(&#39;employee&#39;); 
$employees->appendChild($employee); 
//在 employee标签下创建 serial_no子标签 
$serial_no = $dom->createElement(&#39;serial_no&#39;); 
$employee->appendChild($serial_no); 
//为 serial_no标签添加值节点 100001 
$serial_no_value = $dom->createTextNode(&#39;100001′); 
$serial_no->appendChild($serial_no_value); 
//输出 XML数据 
echo $dom->saveXML(); 
?> 
输出结果如下所示。 
 
 
 
 
 
100001 
 
 
 
 
 
DOM组件除了可以用来动态创建 XML文档外,还可以用来读取 XML文件。以下代码实现了对前 
面 XML文件的读取。 
代码如下:
$dom = new DomDocument(); //创建 DOM对象 
$dom->load(&#39;example.xml&#39;); //读取 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.”
”; 
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文件的格式设计如下。 
 
代码如下:
 
 
 
 
这里是留言者 
这里是留言内容 
 
 
 
4.2 提交页面的编写 
提交留言页面由两个页面组成。一个是让访问者用来书写留言的表单的 HTML文件,一个是用来处理访问者输入的 PHP脚本。表单的 HTML代码如下所示。 
代码如下:
 
 
 
 
 
 

发表新的留言

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
标题
作者
内容
 

 

 
 

 
 
 
 
 
对于用来处理用户输入的 PHP脚本,其基本逻辑是首先创建一个 DOM对象,然后读取 XML文件中的 XML数据,接下来在 XML对象上创建新的节点并将用户的输入储存起来,最后将 XML数据输出到原来的 XML文件中。具体实现代码如下所示。 
代码如下:
$guestbook = new DomDocument(); //创建一个新的 DOM对象 
$guestbook->load(&#39;DB/guestbook.xml&#39;); //读取 XML数据 
$threads = $guestbook->documentElement; //获得 XML结构的根 
//创建一个新 thread节点 
$thread = $guestbook->createElement(&#39;thread&#39;); 
$threads->appendChild($thread); 
//在新的 thread节点上创建 title标签 
$title = $guestbook->createElement(&#39;title&#39;); 
$title->appendChild($guestbook->createTextNode($_POST[&#39;title&#39;])); 
$thread->appendChild($title); 
//在新的 thread节点上创建 author标签 
$author = $guestbook->createElement(&#39;author&#39;); 
$author->appendChild($guestbook->createTextNode($_POST[&#39;author&#39;])); 
$thread->appendChild($author); 
//在新的 thread节点上创建 content标签 
$cOntent= $guestbook->createElement(&#39;content&#39;); 
$content->appendChild($guestbook->createTextNode($_POST[&#39;content&#39;])); 
$thread->appendChild($content); 
//将 XML数据写入文件 
$fp = fopen(”DB/guestbook.xml”, “w”); 
if(fwrite($fp, $guestbook->saveXML())) 
echo “留言提交成功”; 
else 
echo “留言提交失败”; 
fclose($fp); 
?> 
 
在浏览器中运行上述 HTML文件并填写适当的留言内容,如图 2所示。 
 
图 2 发表新留言界面 
单击【Submit】按钮后,XML文件中的内容如下所示。 
可以看到 XML文件中已经将留言存储起来了。 
4.3 显示页面的编写 
显示页面可以使用前面介绍的 SimpleXML组件很容易的实现,具体实现代码如下所示。 
代码如下:
//打开用于存储留言的 XML文件 
$guestbook = simplexml_load_file(&#39;DB/guestbook.xml&#39;); 
foreach($guestbook->thread as $th) //循环读取 XML数据中的每一个 thread标签 
echo “标题:”.$th->title.”
”; 
echo “作者:”.$th->author.”
”; 
echo “内容:
”.$th->content.”
”; 
echo “
”; 
?> 
 
 
在浏览器中查看运行结果如图 3所示。 
 
 
您可能感兴趣的文章:
PHP读取XML值的代码(推荐)
php读取xml实例代码
用PHP编写和读取XML的几种方式
PHP中的生成XML文件的4种方法分享
用PHP读取和编写XML DOM的实现代码
PHP中simplexml_load_string函数使用说明
php xml 入门学习资料
PHP操作XML作为数据库的类
php生成xml简单实例代码
php与XML、XSLT、Mysql的结合运用实现代码
PHP 生成的XML以FLASH获取为乱码终极解决
PHP读取xml方法介绍
详细出处参考:http://www.jb51.net/article/23912.htmXML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据。在实际应用中,一些简单的、安全性较低的数据往往使用 XML文件的格式进行存储。这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用 XML的优越性降低程序的编写难度。 
PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序。本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍。 
1 XML简介 
XML是“可扩展性标识语言(eXtensible Markup Language)”的缩写,是一种类似于 HTML的标记性语言。但是与 HTML不同,XML主要用于描述数据和存放数据,而 HTML主要用于显示数据。 
XML是一种“元标记”语言,开发者可以根据自己的需要创建标记的名称。例如,下面的 XML代码可以用来描述一条留言。 
 
 
代码如下:
 
 
Simon 
Welcome to XML guestbook!! 
 
 
其中,标签标记了这是一段留言。在留言中有标题、作者、内容,完整的表述了一条留言信息。 
在一个 XML文件的顶部,通常使用来标识 XML数据的开始和 XML数据使用标准的版本信息。在浏览器中访问 XML文件可以看到层次分明的 XML数据信息,如图 1所示。 
 
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对象 
代码如下:
$data = <<
 
 
 
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 = 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对象。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //创建 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函数输出了上面例子中对象的详细信息。 
代码如下:
 
 
运行结果如下所示。 
代码如下:
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函数来完成,如以下代码 
所示。 
代码如下:
depart as $a) 
echo “$a->name
”; 
?> 
 
运行结果如下所示。 
production support 
testing center 
//读取 XML文件 //循环读取 XML数据中的每一个 depart标签 
//输出其中的 name属性 
也可以使用方括号“ []”来直接读取 XML数据中指定的标签。以下代码输出了上面 XML数据中的第一个“depart”标签的“name”属性。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML文件 
echo $xml->depart->name[0]; //输出节点 
?> 
 
运行结果如下所示。 
production support 
对于一个标签下的所有子标签,SimpleXML组件提供了 children方法进行读取。例如,对于上面的 XML数据中的“ depart”标签,其下包括两个子标签:“ name”和“employees”。以下代码实现了对第一个“depart”标签下的子标签的读取。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); 
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标签。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML文件 
$result = $xml->xpath(&#39;/departs/depart/employees/employee/name&#39;); //定义节点 
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”子标签的修改。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML 
$xml->depart->name[0] = “Human Resource”; //修改节点 
?> 
 
修改后,并不会对 XML文件有任何影响。但是,在程序中,对于 SimpleXML对象的读取将使用修改过的值。 
2.4 标准化 XML数据 
SimpleXML还提供了一种标准化 XML数据的方法 asXML。asXML方法可以有效的将 SimpleXML对象中的内容按照 XML 1.0标准进行重新编排并以字符串的数据类型返回。以下代码实现了对上面 XML数据的标准化。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 XML数据 
echo $xml->asXML(); //标准化 XML数据 
?> 
 
2.5 XML数据的存储 
将 SimpleXML对象中的 XML数据存储到一个 XML文件的方法非常简单,即将 asXML方法的返回结果输出到一个文件中即可。以下代码首先将 XML文件中的 depart name进行了修改,然后将修改过的 XML数据输出到另一个 XML文件。 
代码如下:
$xml = simplexml_load_file(&#39;example.xml&#39;); //读取 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文档。 
 
代码如下:
//创建一个新的 DOM文档 
$dom = new DomDocument(); 
//在根节点创建 departs标签 
$departs = $dom->createElement(&#39;departs&#39;); 
$dom->appendChild($departs); 
//在 departs标签下创建 depart子标签 
$depart = $dom->createElement(&#39;depart&#39;); 
$departs->appendChild($depart); 
//在 depart标签下创建 employees子标签 
$employees = $dom->createElement(&#39;employees&#39;); 
$depart->appendChild($employees); 
//在 employees标签下创建 employee子标签 
$employee = $dom->createElement(&#39;employee&#39;); 
$employees->appendChild($employee); 
//在 employee标签下创建 serial_no子标签 
$serial_no = $dom->createElement(&#39;serial_no&#39;); 
$employee->appendChild($serial_no); 
//为 serial_no标签添加值节点 100001 
$serial_no_value = $dom->createTextNode(&#39;100001′); 
$serial_no->appendChild($serial_no_value); 
//输出 XML数据 
echo $dom->saveXML(); 
?> 
输出结果如下所示。 
 
 
 
 
 
100001 
 
 
 
 
 
DOM组件除了可以用来动态创建 XML文档外,还可以用来读取 XML文件。以下代码实现了对前 
面 XML文件的读取。 
代码如下:
$dom = new DomDocument(); //创建 DOM对象 
$dom->load(&#39;example.xml&#39;); //读取 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.”
”; 
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文件的格式设计如下。 
 
代码如下:
 
 
 
 
这里是留言者 
这里是留言内容 
 
 
 
4.2 提交页面的编写 
提交留言页面由两个页面组成。一个是让访问者用来书写留言的表单的 HTML文件,一个是用来处理访问者输入的 PHP脚本。表单的 HTML代码如下所示。 
代码如下:
<html
 
 
 
 
 

发表新的留言

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
标题
作者
内容
 

 

 
 

 
 
 
 
 
对于用来处理用户输入的 PHP脚本,其基本逻辑是首先创建一个 DOM对象,然后读取 XML文件中的 XML数据,接下来在 XML对象上创建新的节点并将用户的输入储存起来,最后将 XML数据输出到原来的 XML文件中。具体实现代码如下所示。 
代码如下:
$guestbook = new DomDocument(); //创建一个新的 DOM对象 
$guestbook->load(&#39;DB/guestbook.xml&#39;); //读取 XML数据 
$threads = $guestbook->documentElement; //获得 XML结构的根 
//创建一个新 thread节点 
$thread = $guestbook->createElement(&#39;thread&#39;); 
$threads->appendChild($thread); 
//在新的 thread节点上创建 title标签 
$title = $guestbook->createElement(&#39;title&#39;); 
$title->appendChild($guestbook->createTextNode($_POST[&#39;title&#39;])); 
$thread->appendChild($title); 
//在新的 thread节点上创建 author标签 
$author = $guestbook->createElement(&#39;author&#39;); 
$author->appendChild($guestbook->createTextNode($_POST[&#39;author&#39;])); 
$thread->appendChild($author); 
//在新的 thread节点上创建 content标签 
$cOntent= $guestbook->createElement(&#39;content&#39;); 
$content->appendChild($guestbook->createTextNode($_POST[&#39;content&#39;])); 
$thread->appendChild($content); 
//将 XML数据写入文件 
$fp = fopen(”DB/guestbook.xml”, “w”); 
if(fwrite($fp, $guestbook->saveXML())) 
echo “留言提交成功”; 
else 
echo “留言提交失败”; 
fclose($fp); 
?> 
 
在浏览器中运行上述 HTML文件并填写适当的留言内容,如图 2所示。 
 
图 2 发表新留言界面 
单击【Submit】按钮后,XML文件中的内容如下所示。 
可以看到 XML文件中已经将留言存储起来了。 
4.3 显示页面的编写 
显示页面可以使用前面介绍的 SimpleXML组件很容易的实现,具体实现代码如下所示。 
代码如下:
//打开用于存储留言的 XML文件 
$guestbook = simplexml_load_file(&#39;DB/guestbook.xml&#39;); 
foreach($guestbook->thread as $th) //循环读取 XML数据中的每一个 thread标签 
echo “标题:”.$th->title.”
”; 
echo “作者:”.$th->author.”
”; 
echo “内容:
”.$th->content.”
”; 
echo “
”; 
?> 
 
 
在浏览器中查看运行结果如图 3所示。 
 
 
您可能感兴趣的文章:
PHP读取XML值的代码(推荐)
php读取xml实例代码
用PHP编写和读取XML的几种方式
PHP中的生成XML文件的4种方法分享
用PHP读取和编写XML DOM的实现代码
PHP中simplexml_load_string函数使用说明
php xml 入门学习资料
PHP操作XML作为数据库的类
php生成xml简单实例代码
php与XML、XSLT、Mysql的结合运用实现代码
PHP 生成的XML以FLASH获取为乱码终极解决
PHP读取xml方法介绍

推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
author-avatar
手机用户2602931635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有