用JavaScript生成Android SDK的下载地址(3)——放弃xsl,纯JavaScript转换xml为htm...
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:admin 阅读 328
3.1纯JavaScript转换xml因为xml对命名空间的规定比较严格,就算是同一套命名空间的不同版本,也会报告命名空间冲突。按照这个规定,我们必须为每一个版本写一套xsl转换,这样做太麻烦了。而

3.1 纯JavaScript转换xml

 

  因为xml对命名空间的规定比较严格,就算是同一套命名空间的不同版本,也会报告命名空间冲突。按照这个规定,我们必须为每一个版本写一套xsl转换,这样做太麻烦了。而且有可能Google又会更新xml名称空间的版本,那时我们的xsl又会不兼容了。

  这时还不如放弃xsl,用JavaScript分析xml的数据,并将其加工为html字符串。这样就能绕过命名空间问题。

  而且JavaScript下,我们能更灵活的处理数据,比如解决绝对地址问题。

 

  纯JavaScript转换xml其实并不复杂,基本上只需要改动showxml函数——

// 显示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 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"; // 链接模式
}
}
}
}
}
}
divdoc.innerHTML = sall;
}


 

  重点改动——

1.多了一个urlPath参数,用于传递路径。

2.判断是相对地址,还是绝对地址——“if (surl.indexOf("//")<0) surl = urlPath + surl”。

3.将下载地址以链接的方式显示,便于用下载工具下载——“sall += "<a href='" + surl + "'>" + surl + "</a><br/>\n"”

 

 

3.2 计算路径

 

  为什么要加一个urlPath参数呢?这时因为其他厂家的SDK没有放在“https://dl-ssl.google.com/android/repository/”上,而是在厂商自己的网站上。在doload函数中需计算好路径,再传递给showxml函数——

// 加载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);
});
}


 

 

3.3 全部代码

 

  全部代码为——

<!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 3</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">
// 取得命名对象
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);
}

// 显示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 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
联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2