XML

1.5.3 XML

XML(Extensible Markup Language)是一种可扩展的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。关于它的完整的、标准的描述,可以参看 w3c 的官方文档 http://www.w3.org/TR/REC-xml/。之所以这里要讲这种语言,是因为微信后台发给我们的公众账号服务器的 POST 数据就是用这种语言描述的。上一小节中的 $HTTP_RAW_POST_DATA 就是 XML 描述的数据。似乎我们又遇到了大麻烦,不过很幸运的是,我们不需要关注 XML 语言的太多细节,只要知道如何用 PHP 解析它就可以了。

XML 的语法的基本模式是:分别用“<itemName>”和“</itemName>”来表示一个条目的开始和结束,“itemName”可以是任意字符。每个条目也可以有属性,在开始的 <itemName attrName1=“1”attrName2=“2”> 中表示,微信后台给我们发的 XML 没有属性字段。条目的值可以是数字和字符串,也可以是一个或者多个条目,也就是可以嵌套。字符串用“<![CDATA[text]]>”表示,其中 text 可以是任意字符串。用 CDATA 包起来的目的是让 text 中的内容不会解析成别的条目,只会解析成字符串。整个 XML 文档必须要有一个根条目,该条目可以是任意名字。微信后台的信息中的根条目是以“<xml>”开始,以“</xml>”结束的。仔细观察图 1-33 所示的 POST 数据,整个 XML 文档有 6 个条目,都没有嵌套。第一个条目是 ToUserName,它是一个字符串,值为“gh_a8b0ebbe91f5”;第三个条目是 CreateTime,它是一个整型变量,值是 1364458805。其他四个条目也都类似。

PHP 为我们提供了一个很简单的函数来解析 XML—simplexml_load_string。它接受五个参数,第一个是需要解析的 XML 字符串,其他四个参数都是可选的。在解析成功的时候会返回一个 SimpleXMLElement 的对象,如果解析失败则返回 false。一般在入参中传入的 XML 数据不符合规范的时候才会解析失败进而返回 false。代码清单 1-1 所示的例子展示了如何使用 simplexml_load_string 来解析 XML。这个例子继续上一节,我们用 simplexml_load_string 来解析 $HTTP_RAW_POST_DATA,并输出解析后的数据。

代码清单 1-1


<?php
$postXmlStr = $HTTP_RAW_POST_DATA;
$xmlObj = simplexml_load_string($postXmlStr);
if(false === $xmlObj) {
echo "parse xml string error! \n";
exit(0);
}
$toUser = $xmlObj->ToUserName;
echo "to User: " . $toUser . "\n";
$fromUser = $xmlObj->FromUserName;
echo "from User: " . $fromUser . "\n";
$createTime = $xmlObj->CreateTime;
echo "create time: " . $createTime . "\n";
$msgType = $xmlObj->MsgType;
echo "msg type: " . $msgType . "\n";
$content = $xmlObj->Content;
echo "content: " . $content . "\n";
$msgId = $xmlObj->MsgId;
echo "msg id: " . $msgId . "\n";
?>

重新按照上一节的方法,用 fiddler 向 test2.php 发送请求,然后单击选中 fiddler 左边的请求列表中对应到这次请求的条目,双击,在右侧会显示请求的详细返回信息,如图 1-34 所示。
fiddler 中的请求 test2.php 的结果
图1-34 fiddler 中的请求 test2.php 的结果

可以在图 1-34 所示界面右下侧的 TextView 中看到我们在程序中 echo 的输出。可以看到我们是通过对象 $xmlObj 的成员变量来访问 XML 的条目的,引用成员的方式和 C++ 中通过对象指针访问它的 public 成员变量是一样的。PHP 的对象在本书后面的实例中会用到。限于篇幅,这里不过多介绍,读者可以查阅其他资料做更多的了解。


注意 在代码清单 1-1 中判断 simplexml_load_string 的结果是否为 false 使用的是三个等于号“===”。这是 PHP 的“全等于”符号,只有当全等号左边和右边的表达式的大小和类型完全相等时才返回 true。虽然 PHP 是弱类型语言,但并不表示变量没有类型。两个等于号(“==”)只能判断两边的值是否相等。在两个等于号的情况下: false、空字符串、空数组、0 都是相等的。但是使用全等号的判断可以把它们区分开,因为它们的类型不相同。

下一节 1.5.4 MySQL
上一节 1.5.2 HTTP
返回微信公众平台应用开发实战

天香空城微信二维码
关注 天香空城 微信号 ulisse 或扫描二维码,可以了解微信营销书籍
微信营销书评
微信公众平台开发源码

返回微信营销