- 论坛徽章:
- 0
|
用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——- // 返回图层对象,根据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——- // 显示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;}
- 在调试时发现,因repository-5.xml文件较多,加载时间较长。而厂商的xml一般较小,加载时间短,会排在前面。而我们希望按“API Level”排序。最简单的解决方式是预先执行getMyDiv——
- // 初始化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);}
复制代码 全部代码为——
- <!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)'>"+ " "+ 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 |
|