在数据接口开发中,使用 XML 格式传输数据很常见。PHP 如何生成和获取它呢?下面就详细说说。
生成数据前的准备
在生成 XML 格式数据前,得先明确需求。假设系统里有张学生信息表 student,要提供给第三方调用,表中有 id、name、sex、age 这些字段,分别记录学生的姓名、性别和年龄等。我们要做的就是把这些数据以 XML 格式提供出去。这时,要创建一个 createXML.php 文件,为生成 XML 做准备,这是后续操作的基础。
建立数据库连接
在 createXML.php 文件里,第一步就是连接数据库。只有连接上数据库,才能获取到学生信息表 student 中的数据。连接成功后,数据会保存在变量 $arr 中。可以使用 print_r 函数打印数据进行测试,看看是否正确获取到了数据。确保数据无误,才能接着进行后续的 XML 生成操作。
CREATE TABLE `student` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, `sex` varchar(10) NOT NULL, `age` smallint(3) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
创建 XML 文档
include_once ("connect.php"); //连接数据库
$sql = "select * from student";
$result = mysql_query($sql) or die("Invalid query: " . mysql_error());
while ($row = mysql_fetch_array($result)) {
$arr[] = array(
'name' => $row['name'],
'sex' => $row['sex'],
'age' => $row['age']
);
}
接下来开始创建 XML 文档。这里我们调用 PHP 内置的类 DOMDocument 来处理与生成 XML。先建立 XML 框架,然后循环数组 $arr,把数据写入到 XML 对应的节点中。通过这种方式,将数据库里的学生信息转化为 XML 格式的数据,方便第三方调用。最终生成的 XML 格式效果,可以点击相关链接查看。
获取数据的场景
$doc = new DOMDocument('1.0', 'utf-8'); // 声明版本和编码
$doc->formatOutput = true;
$r = $doc->createElement_x("root");
$doc->appendChild($r);
foreach ($arr as $dat) {
$b = $doc->createElement_x("data");
$name = $doc->createElement_x("name");
$name->appendChild($doc->createTextNode($dat['name']));
$b->appendChild($name);
$sex = $doc->createElement_x("sex");
$sex->appendChild($doc->createTextNode($dat['sex']));
$b->appendChild($sex);
$age = $doc->createElement_x("age");
$age->appendChild($doc->createTextNode($dat['age']));
$b->appendChild($age);
$r->appendChild($b);
}
echo $doc->saveXML();
现在假设要从第三方获取学生信息,且数据格式是 XML。我们的任务就是使用 PHP 解析这些 XML 数据,然后把解析后的数据显示出来或者写入本地数据库。而解析 XML 是关键的一步,只有准确解析,才能得到有用的数据。
解析 XML 的方法
PHP 有多种解析 XML 的方法,其中内置的 XMLReader 类很实用。它可以循序地浏览 XML 文件的节点,就像游标走过整个文件的节点一样,能抓取我们需要的内容。使用 XMLReader 很高效,尤其是读取非常大的 XML 数据时,和其他方法相比,它消耗的内存非常少。
李王皓 男 21 ...
数据的分离处理
为了把数据 name、sex 和 age 分开,我们使用 $i%3 来判断取模。因为在获取的 XML 中,节点 data 下的信息是以 3 个子节点存在的。通过这种方式,可以把不同的数据区分开来,方便后续使用。
大家在使用 PHP 进行 XML 数据生成和获取时,有没有遇到过什么特别的问题呢?希望大家点赞、分享这篇文章,一起交流学习!