很多时候,当我们数据量不大或者为了快速加载,我们要用到XML文件来存一些数据,今天我就跟大家讲讲我在PHP项目当中用过XML操作数据的一些经历。
首先,我们PHP自身本来就有相关操作XML的函数集,这样,我们操作XML,就不用再用其它插件了。
下面是PHP自身的XML函数集,我在这里给予列出:
SimpleXMLElement::addAttribute — 为XML节点增加一个属性
SimpleXMLElement::addChild — 为XML增加一个子节点
SimpleXMLElement::asXML — 返回一个已经格式好了的XML
SimpleXMLElement::attributes —等同一个节点的属性集
SimpleXMLElement::children — 通过给的节点去查找子节点
SimpleXMLElement::__construct — 构造函数,创建一个新的XML对象
SimpleXMLElement::count — 计算一个节点的子节点总数
SimpleXMLElement::getDocNamespaces — 返回document命名空间
SimpleXMLElement::getName — 取得XML节点的名字
SimpleXMLElement::getNamespaces — 返回一个使用的document的命名空间的名字
SimpleXMLElement::registerXPathNamespace — Creates a prefix/ns context for the next XPath query
SimpleXMLElement::xpath — Runs XPath query on XML data
具体的运用:
$data = '<?xml version="1.0" encoding="gb2312" ?>'; //创建XML文件头部
$xml = new SimpleXMLElement($data); //构造一个XML对象,并且把对应的头部以参数的形式给出;
$id = intval(getRequest('id', 0));
$lotid = intval(getRequest('lotid', 0));
$PrizeBulle = News_Article::getPrize($id); //从数据库中取数据;
$prizecount = count($PrizeBulle);
if(!empty($PrizeBulle))
{
$m = $xml->addChild('state',100); //创建子节点state
$m = $xml->addChild('message',iconv('gbk','utf-8','获取成功')); //注意,如果是中文,
//则要转码后才行,不然会是乱码;
$list = $xml->addChild('list');
for ($i = 0;$i < $prizecount; $i++)
{
$row = $list->addChild('row');
$row->addChild('title',iconv('gbk','utf-8',$PrizeBulle[$i]['TITLE'])); //为子节点再增加节点
$row->addChild('imgadd',$PrizeBulle[$i]['TICKETURL']);
$row->addChild('user',iconv('gbk','utf-8',$PrizeBulle[$i]['INITIATOR']));
$row->addChild('prizedetail',iconv('gbk','utf-8',$PrizeBulle[$i]['PRIZEDESCRIPTION']));
$row->addChild('fatype',iconv('gbk','utf-8',$PrizeBulle[$i]['PLAYTYPE']));
$row->addChild('lotid',$lotid);
$row->addChild('playtype',$PrizeBulle[$i]['PLAYTYPEID']);
$row->addChild('pid',$PrizeBulle[$i]['PROJECTID']);
}
}else{
$m = $xml->addChild('state',109);
$m = $xml->addChild('message',iconv('gbk','utf-8','获取失败'));
}
header("content-type: text/xml"); //设置header头信息
echo $xml->asXML(); //输出XML文件的内容
这里需要注意的就是转码问题,如果XML当中有中文,并且编码与XML不一致,则需要先转码后才进行输出;