php提供了一整套的读取 xml文件的方法,很容易的就可以编写基于 xml的脚本程序。本章将要介绍 php与 xml的操作方法,并对几个常用的 xml类库做一些简要介绍。
1 xml简介
xml是“可扩展性标识语言(extensible markup language)”的缩写,是一种类似于 html的标记性语言。但是与 html不同,xml主要用于描述数据和存放数据,而 html主要用于显示数据。
xml是一种“元标记”语言,开发者可以根据自己的需要创建标记的名称。例如,下面的 xml代码可以用来描述一条留言。
复制代码 代码如下:
welcome
simon
welcome to xml guestbook!!
其中,与标签标记了这是一段留言。在留言中有标题、作者、内容,完整的表述了一条留言信息。
在一个 xml文件的顶部,通常使用来标识 xml数据的开始和 xml数据使用标准的版本信息。在浏览器中访问 xml文件可以看到层次分明的 xml数据信息,如图 1所示。
'700')this.width='700';if(this.offsetheight>'700')this. style=max-width:90%; border=0>
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变量存储了一段 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对象。
复制代码 代码如下:
其中,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”属性。
复制代码 代码如下:
depart->name[0]; //输出节点
?>
运行结果如下所示。
production support
对于一个标签下的所有子标签,simplexml组件提供了 children方法进行读取。例如,对于上面的 xml数据中的“ depart”标签,其下包括两个子标签:“ name”和“employees”。以下代码实现了对第一个“depart”标签下的子标签的读取。
复制代码 代码如下:
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标签。
复制代码 代码如下:
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”子标签的修改。
复制代码 代码如下:
depart->name[0] = “human resource”; //修改节点
?>
修改后,并不会对 xml文件有任何影响。但是,在程序中,对于 simplexml对象的读取将使用修改过的值。
2.4 标准化 xml数据
simplexml还提供了一种标准化 xml数据的方法 asxml。asxml方法可以有效的将 simplexml对象中的内容按照 xml 1.0标准进行重新编排并以字符串的数据类型返回。以下代码实现了对上面 xml数据的标准化。
复制代码 代码如下:
asxml(); //标准化 xml数据
?>
2.5 xml数据的存储
将 simplexml对象中的 xml数据存储到一个 xml文件的方法非常简单,即将 asxml方法的返回结果输出到一个文件中即可。以下代码首先将 xml文件中的 depart name进行了修改,然后将修改过的 xml数据输出到另一个 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文档。
复制代码 代码如下:
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();
?>
输出结果如下所示。
100001
dom组件除了可以用来动态创建 xml文档外,还可以用来读取 xml文件。以下代码实现了对前
面 xml文件的读取。
复制代码 代码如下:
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.”
”;
}
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代码如下所示。
复制代码 代码如下:
发表新的留言
