免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1696 | 回复: 0
打印 上一主题 下一主题

用JavaScript生成Android SDK的下载地址(4)——按“API Level”分类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-28 16:51 |只看该作者 |倒序浏览
用JavaScript生成Android SDK的下载地址(4)——按“API Level”分类
  








按“API Level”分类对于网页程序而言,可以理解为——将数据输出到不同的div。

  很多SDK是与 API Level 相关的,具有“sdk:api-level”属性,它是一个整数,值为2(Android 1.1)至14(Android 4.0)。我们可以用数组来管理——

var arrAPI = new Array();    // API Level数组。用于管理给出了API Level的。



  除了与 API Level 相关的SDK外,还有一些文件是与SDK无关的,它们没有“sdk:api-level”属性。怎么处理呢?按xml标签名进行分类似乎比较好。因标签名是一个字符串,应使用Object来管理集合——

var arrTag = new Object();    // tag集合。用于管理没有给出API Level的。

  然后在页面中添加两个div,决定数据所显示的位置——

<div id="divAPI"></div><div id="divTag"></div>

  再编写一个getMyDiv函数,根据API Level和标签,返回所对应的div——
  1. // 返回图层对象,根据API Level和tagfunction getMyDiv(sapilevel, stag){    var div = null;    var l = parseInt(sapilevel);    if ( isNaN(l) || l<0 )    {        // 无API Level,根据tag        div = arrTag[stag];        if (null==div)        {            div = document.createElement("div");            div.className = "div_border";            var divTag = getRef("divTag");            divTag.appendChild(div);            divTag.appendChild(document.createElement("br"));    // 空一行            arrTag[stag] = div;        }    }    else    {        // 根据API Level        div = arrAPI[l];        if (null==div)        {            div = document.createElement("div");            div.className = "div_border";            var divAPI = getRef("divAPI");            divAPI.appendChild(div);            divAPI.appendChild(document.createElement("br"));    // 空一行            arrAPI[l] = div;        }    }    return div;}
复制代码
  showxml函数只需要做少许调整,改为在内循环中将数据输出到对应的div——
  1. // 显示xmlfunction showxml(urlPath, divdoc, xmlDoc){    if (null==divdoc) return;    if (null==xmlDoc)    {        divdoc.innerHTML = "error!";        return;    }    // == main ==    //divdoc.innerHTML = xml_transformNode(xmlDoc, xsl);    divdoc.innerHTML = "OK!";    // Parse    //var sall = "";    // 所有内容    var nodes=xmlDoc.documentElement.childNodes;    for(var i=0; i<nodes.length; i++)    // 第一级。sdk:platform, sdk:sample, ...    {        var nod = nodes[i];        var stag = nod.nodeName.substr(4);    // 标签名        if (1==nod.nodeType)    // 节点类型为元素时        {            var nod2 = nod.selectSingleNode("sdk:archives");    // 第二级。sdk:archives(文件集)            if (null!=nod2)    // 当文件集存在时才添加            {                var sall = "";                // 读取参数                var sapilevel = xml_text(nod.selectSingleNode("sdk:api-level"));                var srevision = xml_text(nod.selectSingleNode("sdk:revision"));                var sdescription = xml_text(nod.selectSingleNode("sdk:description"));                // 标题                var stitle = stag + "(";                if (""!=sapilevel) stitle += sapilevel + ", ";                stitle += "r" + srevision + "): " + sdescription;                // 添加                sall += "<h2>" + stitle + "</h2>\n";                // 档案                for(var i3=0; i3<nod2.childNodes.length; i3++)    // 第三级。sdk:archive                {                    var nod3 = nod2.childNodes[i3];                    if ("sdk:archive"==nod3.nodeName)                    {                        var surl = xml_text(nod3.selectSingleNode("sdk:url"));// 下载地址                        if (null!=surl)                        {                            if (surl.indexOf("//")<0)    surl = urlPath + surl;    // 将相对路径转为绝对路径                            // 添加url                            //sall += "" + surl + "<br/>\n";    // 文本模式                            sall += "<a href='" + surl + "'>" + surl + "</a><br/>\n";    // 链接模式                        }                    }                }                // 加入                var div = getMyDiv(sapilevel, stag);                if (null!=div)                {                    div.innerHTML = div.innerHTML + sall;                }            }        }    }    //divdoc.innerHTML = sall;}
  2.   在调试时发现,因repository-5.xml文件较多,加载时间较长。而厂商的xml一般较小,加载时间短,会排在前面。而我们希望按“API Level”排序。最简单的解决方式是预先执行getMyDiv——

  3. // 初始化function init(){    // 预先执行getMyDiv,使API Level排序正确    for(var i=2; i<=14; i++)    getMyDiv(i, "");        // Load main    doload("http://dl.google.com/android/repository/repository-5.xml", "main");        // Load addons_list    xml_loadFile("http://dl.google.com/android/repository/addons_list-1.xml", onload_addons);}
复制代码
  全部代码为——

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>    <head>        <title>Anroid SDK URL 4</title>        <style type="text/css">.div_border{    border:red dotted thin;    padding: 2px;}        </style>        <script type="text/javascript" src="zyllibjs_xml.js"></script>        <script type="text/javascript">// 全局变量var arrAPI =new Array();    // API Level数组。用于管理给出了API Level的。var arrTag =new Object();    // tag集合。用于管理没有给出API Level的。// 取得命名对象function getRef(id){    if (document.getElementById) return document.getElementById(id);    // DOMif (document.all) return document.all[id];    // IE4if (document.layers) return document.layers[id];    // Netscape4returnnull;}// 显示或隐藏控件function setShow(ctl, isShow, _display){    if (null==ctl)    return;    ctl.style.display = isShow?(_display||"inline"):"none";    ctl.style.visibility = isShow?"visible":"hidden";}// 展开/折叠 显示function click_show(ctl){    var s = ctl.value;    var isShow = ("+"==s);    ctl.value = isShow?"-":"+";    var divdoc = ctl.parentNode.lastChild;    setShow(divdoc, isShow);}// 返回图层对象,根据API Level和tagfunction getMyDiv(sapilevel, stag){    var div =null;    var l = parseInt(sapilevel);    if ( isNaN(l) || l<0 )    {        // 无API Level,根据tag        div = arrTag[stag];        if (null==div)        {            div = document.createElement("div");            div.className ="div_border";            var divTag = getRef("divTag");            divTag.appendChild(div);            divTag.appendChild(document.createElement("br"));    // 空一行            arrTag[stag] = div;        }    }    else    {        // 根据API Level        div = arrAPI[l];        if (null==div)        {            div = document.createElement("div");            div.className ="div_border";            var divAPI = getRef("divAPI");            divAPI.appendChild(div);            divAPI.appendChild(document.createElement("br"));    // 空一行            arrAPI[l] = div;        }    }    return div;}// 显示xmlfunction showxml(urlPath, divdoc, xmlDoc){    if (null==divdoc) return;    if (null==xmlDoc)    {        divdoc.innerHTML ="error!";        return;    }    // == main ==//divdoc.innerHTML = xml_transformNode(xmlDoc, xsl);    divdoc.innerHTML ="OK!";    // Parse//var sall = "";    // 所有内容var nodes=xmlDoc.documentElement.childNodes;    for(var i=0; i<nodes.length; i++)    // 第一级。sdk:platform, sdk:sample, ...    {        var nod = nodes[i];        var stag = nod.nodeName.substr(4);    // 标签名if (1==nod.nodeType)    // 节点类型为元素时        {            var nod2 = nod.selectSingleNode("sdk:archives");    // 第二级。sdk:archives(文件集)if (null!=nod2)    // 当文件集存在时才添加            {                var sall ="";                // 读取参数var sapilevel = xml_text(nod.selectSingleNode("sdk:api-level"));                var srevision = xml_text(nod.selectSingleNode("sdk:revision"));                var sdescription = xml_text(nod.selectSingleNode("sdk:description"));                // 标题var stitle = stag +"(";                if (""!=sapilevel) stitle += sapilevel +", ";                stitle +="r"+ srevision +"): "+ sdescription;                // 添加                sall +="<h2>"+ stitle +"</h2>\n";                // 档案for(var i3=0; i3<nod2.childNodes.length; i3++)    // 第三级。sdk:archive                {                    var nod3 = nod2.childNodes[i3];                    if ("sdk:archive"==nod3.nodeName)                    {                        var surl = xml_text(nod3.selectSingleNode("sdk:url"));// 下载地址if (null!=surl)                        {                            if (surl.indexOf("//")<0)    surl = urlPath + surl;    // 将相对路径转为绝对路径// 添加url//sall += "" + surl + "<br/>\n";    // 文本模式                            sall +="<a href='"+ surl +"'>"+ surl +"</a><br/>\n";    // 链接模式                        }                    }                }                // 加入var div = getMyDiv(sapilevel, stag);                if (null!=div)                {                    div.innerHTML = div.innerHTML + sall;                }            }        }    }    //divdoc.innerHTML = sall;}// 加载xmlfunction doload(url, desc){    // 创建边框divvar divrect = document.createElement("div");    divrect.className ="div_border";    divrect.title = url;    divrect.innerHTML ="<input type='button' value='-' onclick='click_show(this)'>"+        "&nbsp;"+ url +"<br />"+        ((""!=desc)?("<b>desc</b>: "+ desc +"<br />"):"")+        "<div name='divdoc'>loading...</div>";            // addvar divShow = getRef("divShow");    divShow.appendChild(divrect);    divShow.appendChild(document.createElement("br"));    // 空一行        // 计算路径var urlPath ="http://dl.google.com/android/repository/";    // 默认路径if (url.indexOf("//")>=0)    {        // 是外网路径,进行转换        urlPath = url.substr(0, url.lastIndexOf("/")+1);    }        // 加载xml    xml_loadFile(url, function(xmlDoc, isError){        // 用xsl转换xmlvar divdoc = divrect.lastChild;        showxml(urlPath, divdoc, isError?null:xmlDoc);    });}// 处理附加SDK列表function onload_addons(xmlDoc, isError){    // UIvar divAddons = getRef("divAddons");    if (isError)    {        divAddons.innerHTML ="addons_list-1.xml: error!"        return;    }    setShow(divAddons, false);    // 加载成功,隐藏本div        // Parsevar nodes=xmlDoc.documentElement.childNodes;    for(var i=0; i<nodes.length; i++)    {        var nod = nodes[i];        if ("sdk:addon-site"==nod.nodeName)        {            var sUrl = xml_text(nod.selectSingleNode("sdk:url"));            var sName = xml_text(nod.selectSingleNode("sdk:name"));            // load            doload(sUrl, sName);        }    }}// 初始化function init(){    // 预先执行getMyDiv,使API Level排序正确for(var i=2; i<=14; i++)    getMyDiv(i, "");        // Load main    doload("http://dl.google.com/android/repository/repository-5.xml", "main");        // Load addons_list    xml_loadFile("http://dl.google.com/android/repository/addons_list-1.xml", onload_addons);}        </script>    </head><body onload="init()">    <h1>Anroid SDK URL(安卓SDK地址)</h1><br />    <div id="divAPI"></div>    <div id="divTag"></div>    <div id="divShow"></div>    <div id="divAddons" class="div_border">addons_list-1.xml: loading...</div></body></html>
复制代码
  运行效果为——

[sdkurl4.png]





  完美完成!



(全文完)



源码下载——

http://files.cnblogs.com/zyl910/android_sdk_url.rar
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP