読み込んでいます...

前面我们制作了几个简单的Windows Mobile 6.5 Widget,但是这还不够,如果要做一个强大的Windows Mobile 6.5 Widget,我们势必要连接数据源进行数据的显示,我昨天晚上研究这个问题研究到3点多还没研究清楚,今天又想了半天,还直接加了WM Team的人询问了情况,可以说,暂时Windows Mobile 6.5 Widget还不够那么强大,不过我们可以用折中的方法获取数据,就是读取XML,读取XML是一个非常不错的选择,因为大部分的数据交换都能用XML描述。当然,在客户端浏览器上读取XML时非常简单的一件事,但是是否在Widget这个引擎中读取也一样是一件简单的事情呢。

其实,在思路上差不多,但是有些细节要注意。我们可以使用XMLHttpRequest对象获取远程服务器上的文本,然后再进行转换,值得注意的是,这里暂时不支持XMLDom,所以我们只能用正则表达式的形式获取XML的数据了。我们先写文本内容,代码如下所示。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    
<title>Default Page</title>
    
<link href="css/css.css" rel="stylesheet" type="text/css" />
    
<script src="lib/jquery-1.3.2.min.js" type="text/javascript"></script>
    
<script src="lib/httprequest.js" type="text/javascript"></script>
</head>

<body>
    
<div id="mother"></div>
</body>
</html>

我们用的是一个非常非常简单的页面,这个页面使用了JQuery和我们自己写的类,另外说明一下,用JQuery的$.get方法好像并不能够获取到远程的XML数据,并且获取的数据获取的responseXML也很有可能为null,所以我们只好用最原始的方法获取数据。其中httprequest代码如下所示。

function CheckHttpRequest(url)
{
    
//check the httprequest and get the request from the url
    var text;
    
var req=new XMLHttpRequest();
    req.open(
"GET", url, false);
    req.send(
null);
    
if(req.status==200)
    {
        text
= req.responseText;
    }
    
else
    {
        text
= "";
    }
    
return text;
}

上面的代码就是获取一个url的内容,我们获取XML或RSS都行,反正用正则表达式获取的。其中我们还需要使用一个方法,这个方法就是获取XML的标记,由于这里用不了XMLDom,所以只能用正则,示例代码如下所示。

function GetElement(ele,text)
{
    
var reg = new RegExp("<"+ele+">.*<\/"+ele+">","g");
    
var show=text.match(reg);
    
//replace the element
    for(i=0;i<show.length;i++)
    {
        show[i]
= show[i].replace("<"+ele+">","").replace("</"+ele+">","");
    }
    
//return now array
    return show;
}

上面的代码也非常简单,就是从文本中找到字符并替换掉标记,上面两个方法都是在我们的httprequest类中的,我们保存之后再直接在我们的html里面编写即可,html里面的script代码如下所示。

$(document).ready(function(){
    
try{
        
var t = CheckHttpRequest("http://www.jguoer.com/syndication.axd");
        
var title = GetElement(title,t);
        
var link  = GetElement(link,t);
        
for(i=1;i<link.length;i++)
        {
            
var divs = "<div style=’border-bottom:1px solid
            #ccc;background:#fafafa;padding:5px;’>
"+title[i]+"</div>";
            $(
"#mother").append(divs);
        }
    }
    
catch(e)
    {
        
var divs = "<div style=’border-bottom:1px solid #ccc;
                    background:#fafafa;padding:5px;color:red’>Error Happend!</div>
";
        $(
"#mother").append(divs);
    }
});

这样我们一个读取远程数据的widget就制作好了,同样打包并运行,运行结果如下图。

 

这里URL是填写的我的博客的RSS数据,这里我们看到的也是我的博客的RSS数据,说明我们的RSS读取成功了。

不过这里有一个很大的缺点,就是加载的时候速度有点慢,这对应用程序来说可以说致命伤,所以基础好的可以在页面上再加上一个loading界面,这样就看上去更加有好一点。不过可以说,WM的Widget还需要有很多要做。另一种方式就是使用AJAX 4和ADO.NET Entity进行数据访问,不知道国内有多少人用.NET 3.5 SP1并有主机,看来在中国是不太现实的啊。明天我有可能翻译一个国外WM友人的一篇文章,如何使用AJAX 4和ADO.NET Entity进行数据访问。

  1. 置顶的更新,文章汇总 : GuoJing's Blog | 用心对待每一行代码 @

    [...] Windows Mobile 6.5 Widget – 读取远程XML数据 [...]

:-D :-? 8) :cry: 8-O :lol: :-x :-| :?: :-P :oops: :roll: :( :) :-o :wink: more »