最近工作要求从一个XML文档中批量读取APK应用数据,自然想到用SimpleXML。经过一段时间摸索,终于成功解析,现在将思路以及代码做下记录:
xml文件格式大致如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html xmlns="http//www.w3.org/1999/xhtml" xml:lang="en"> <body> <appinfos> <appinfo> <name>app1</name>
<icon>http://www.baidu.com/pic/dxdfdf.png</icon> <downurl>http://www.baidu.com/down/sdkdfk.apk</downurl> <screenshot1>http://www.baidu.com/pic/sdfuererieir.png</screenshot1> </appinfo> <name>app2</name> <icon>http://www.baidu.com/pic/dxdfdf.png</icon> <downurl>http://www.baidu.com/down/sdkdfk.apk</downurl> <screenshot1>http://www.baidu.com/pic/sdfuererieir.png</screenshot1> </appinfo> <name>app3</name> <icon>http://www.baidu.com/pic/dxdfdf.png</icon> <downurl>http://www.baidu.com/down/sdkdfk.apk</downurl> <screenshot1>http://www.baidu.com/pic/sdfuererieir.png</screenshot1> </appinfo> </appinfos> </body> </html>
我得需求是要从这个文件中得到所有的apk信息(apk1,apk2,apk3....)。php代码是这样的:
<?php
header("content-type:text/html;charset=utf-8");
error_reporting(E_ALL);
$xmlObj = simplexml_load_file("new.xml");
foreach($xmlObj->body->appInfos->appInfo as $key => $val){
foreach($val as $ck => $cv){
$arr[$ck] = (string)$cv; //这个地方的string做了强制转换,否则系统会仍为$cv是一个simpleXML对象,这样是得不到字符串结果的
}
var_dump($arr);
$str = json_encode($arr);
file_put_contents("data.txt",$str."\r",FILE_APPEND);
$arr = array();
}
观察这行代码:$xmlObj->body->appInfos->appInfo可以发现,SimpleXML的操作类似于一个嵌套对象,一级一级往下找,找到appInfo发现是多个,后面的代码遍历一下就得到结果了。
注意xml的标准比较严格,实体&,<,>,',"需要分别转义成&,$lt;,$gt;,$apos;,$quot;
最末级的数据比如:<icon>http://www.baidu.com/pic/006.png</icon>,在</icon>前如果有换行读取时也是会报错的。还有,<br />一定要这样写才行。