zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  按“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和tag
function 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——

// 显示xml
function 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); // DOM
if (document.all) return document.all[id]; // IE4
if (document.layers) return document.layers[id]; // Netscape4
returnnull;
}

// 显示或隐藏控件
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和tag
function 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;
}

// 显示xml
function 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;
}

// 加载xml
function doload(url, desc)
{
// 创建边框div
var 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>";

// add
var 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转换xml
var divdoc = divrect.lastChild;
showxml(urlPath, divdoc, isError
?null:xmlDoc);
});
}

// 处理附加SDK列表
function onload_addons(xmlDoc, isError)
{
// UI
var divAddons = getRef("divAddons");
if (isError)
{
divAddons.innerHTML
="addons_list-1.xml: error!"
return;
}
setShow(divAddons,
false); // 加载成功,隐藏本div

// Parse
var 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]

 

  完美完成!

 

(全文完)

 

源码下载——

https://files.cnblogs.com/zyl910/android_sdk_url.rar

posted on 2011-11-28 16:27  zyl910  阅读(1121)  评论(0编辑  收藏  举报