金牌榜 - html分析/xml分页应用一例

  • 作者:L4cd 来源:L4cd.Net 文章点击数:

  最近奥运期间,除了支持中国队以外,今天制作了"金牌榜"一例。主要应用到下面的常用技巧:
html源码读取
html+正则获取数据
文本转xml
xml动态创建列表
从xml获取我们想得到的数据
xml分页
巧用htmlText做简单的页码

//Copyright © 2008. Http://L4cd.Net All Rights Reserved.
package 
{
  import flash.events.*;
  import flash.net.*;
  import flash.display.*;
  import flash.system.*;
  import flash.utils.*;
  import flash.text.*;
  /**
  * 通过分析http://2008.qq.com/medals/中的html代码,获取当前最新的金牌榜
  * 
  * @author L4cd.Net
  * @version 2008-8-11 20:46
  */
  public class olympic extends Sprite
  {
    //定义数据源,这里以QQ为例
    private const server:String = "http://2008.qq.com/medals/"
    //定义页码/单页记录数/总页数
    private var page:uint;
    private const pagesize:uint = 10;
    private var pageCount:uint
    //定义list的偏移
    private var _x:uint = 2;
    private  var _y:uint = 29;
    //用于保存数据与列表
    private var data:XMLList;
    private var list:Array;
    public function olympic() 
    {
      //不多说了
      stage.scaleMode = "noScale";
      stage.showDefaultContextMenu = false
      init()
    }
    private function init():void
    {
      //开始读取数据
      dataRefurbish()
      //侦听页码点击
      txt_pager.addEventListener(TextEvent.LINK, link)
    }
    private function textShow(txt:String):void
    {
      txt_pager.htmlText = txt
    }
    private function dataRefurbish():void
    {
      textShow("开始读取.")
      var loader:URLLoader = new URLLoader()
      loader.addEventListener(Event.COMPLETE, dataComplete);
      loader.addEventListener(IOErrorEvent.IO_ERROR, dataError);
      loader.load(new URLRequest(server))
    }
    private function dataError(e:IOErrorEvent):void
    {
      textShow("读取出错!")
    }
    private function dataComplete(e:Event):void
    {
      //删除之前创建的列表
      listDelete()
      //分析html文本
      var html:String = e.target.data.replace(/<img(.*?)>/gis,"<img$1/>")
      var reg:RegExp = new RegExp("<div class=\"fl col708\" id=\"col708\">(.*?)</div>", "gis")
      var rs:Object = reg.exec(html)
      //保存html文本到XML对象
      data = new XMLList()
      try
      {
        data = (new XML(rs["0"])..tr);  
      }catch(e:Error){}
      if (data.length() < 2)
      {
        textShow("分析数据出错!")
        return;
      }
      //删除第一条数据,这里是列表的标题
      delete data[0]
      //初始化分页数据
      page = 0
      pageCount = Math.ceil(data.length() / pagesize);
      trace("总记录", data.length())
      trace("总页数", pagesize)
      //显示列表(第一页)
      dataShow(page)
    }
    private function dataShow(num:uint):void
    {
      //删除之前创建的列表
      listDelete()
      //保存page
      page = num
      list = []
      //动态创建列表
      for (var i:uint = page * pagesize; i < page * pagesize + 10; i++ )
      {
        var item:XML = data[i]
        var mc:MovieClip = new k_list()
        mc.txt_sort.text = String(i + 1);//排名
        mc.txt_name.text = toUTF8String(item..a);//国家名
        mc.txt_j.text = item.td[2];//金
        mc.txt_y.text = item.td[3];//银
        mc.txt_t.text = item.td[4];//铜
        //调整位置
        mc.x = _x;
        mc.y = _y + (i % pagesize) * 25;
        var flag:Loader = new Loader();//国旗
        flag.load(new URLRequest(item..img.@src))
        flag.x = 25
        flag.y = 8
        mc.addChild(flag)
        mc.flag = flag
        
        addChild(mc)

        list.push(mc)
      }
      //更新页码
      pageShow()
    }
    //删除动态创建的列表
    private function listDelete():void
    {
      if (!list) return;
      while (list.length>0)
      {
        var mc:MovieClip = list.pop()
        try{mc.flag.unload()}catch(e:Error){}
        delete mc.flag
        removeChild(mc)
        mc = null
      }
      list = null
    }
    //更新页码
    private function pageShow():void
    {
      txt_pager.htmlText = "page:"
      for (var i:uint = 0; i < pageCount; i++ )
      {
        if (i == page)
        {
          txt_pager.htmlText += " <u>" + (i + 1) + "</u>";
        }else
        {
          txt_pager.htmlText += " <a href=’event:" + i + "’>" + (i + 1) + "</a>";
        }
      }
    }
    //点击页码的连接.跳转分页
    private function link(e:TextEvent):void
    {
      dataShow(uint(e.text))
    }
    
    //国家名字乱码处理
    private function toUTF8String(str:String):String {
      var _byArr:ByteArray = new ByteArray();
      _byArr.writeUTFBytes(str);
      var tpArr:ByteArray = new ByteArray();
      for (var i:uint = 0; i<_byArr.length; i++) {
        if (_byArr[i] == 194) {
          tpArr.writeByte(_byArr[i+1]);
          i++;
        } else if (_byArr[i] == 195) {
          tpArr.writeByte(_byArr[i+1] + 64);
          i++;
        } else {
          tpArr.writeByte(_byArr[i]);
        }
      }
      tpArr.position = 0;
      return tpArr.readMultiByte(tpArr.bytesAvailable,"chinese");
    }
  }
}

点此在新窗口浏览图片 [点击浏览该文件:2008081414300893.rar]
 

无心人网络 我们一直在努力
  • 相关文章

Copyright 2006-2008 Powered by Noheart.NET无心人网络 All Rights Reserved.

QQ:89232083 E-Mail:leijian212@163.com

豫ICP备08004854号