zoukankan      html  css  js  c++  java
  • 用JavaScript生成Android SDK的下载地址(1)——使用xsl转换xml,得到核心SDK的下载地址

      最近想学习Android开发,可是SDK Manager的下载速度太慢了。电脑开了一整天,SDK包还没有下载完。

      在网上搜索了一下如何快速下载Android SDK。发现一文——《利用迅雷快速下载官方Android SDK》(http://vc4j.com/archives/21.html)。

      该方法确实不错,但存在三个问题——

    1.因官网更新,“repository.xml”已过时,上面没有所需要的Android SDK。

    2.xml文件中的信息很多,找到自己所需的SDK比较费神。而且一般需要下载多个文件(platform、sample、doc、add-on)。

    3.当找到文件名后,要手动合并路径。这样枯燥、机械的操作让人厌烦。

      所以我希望有一个工具,能实现——

    1.能够像SDK Manager一样,找到所有Android SDK。

    2.能够处理xml,只显示Android SDK文件信息。

    3.自动生成下载地址,不需要手动合并路径。最好能做成下载链接,点一下就可让下载工具进行下载,而不需要“复制->切换到下载工具->新建任务->粘贴->确定->切换到浏览器->...”这样机械的循环。

      怎样才能做出这样的工具呢?虽然现在有很多种编程工具支持xml。但很明显,使用网页+JavaScript的方案是最合适的。无需安装,直接显示,而且天生支持下载工具。

      我以前写了一套JavaScript兼容不同浏览器的xml函数库(zyllibjs_xml.js),正好能拿来用一下。可惜后来发现,只有IE默认支持跨域访问。而跨域访问在其他浏览器下,需要做一些复杂的配置。

    (1)——使用xsl转换xml,得到核心SDK的下载地址

    1.1 xml数据

      首先,我们得知道存放了Android SDK文件地址的xml在哪里。

      打开SDK Manager,点击右下角的按钮弹出“log”窗口——

      观察后发现,核心SDK的下载地址是在这个地址——

    https://dl-ssl.google.com/android/repository/repository-5.xml

      将repository-5.xml下载下来,观察其结构。摘录部分——

        <sdk:platform>
    <sdk:version>1.1</sdk:version>
    <sdk:api-level>2</sdk:api-level>
    <sdk:revision>1</sdk:revision>
    <sdk:description>Android SDK Platform 1.1_r1</sdk:description>
    <sdk:desc-url>http://developer.android.com/sdk/android-1.1.html</sdk:desc-url>
    <sdk:obsolete/>
    <sdk:archives>
    <sdk:archive arch="any" os="windows">
    <sdk:size>46828615</sdk:size>
    <sdk:checksum type="sha1">a4060f29ed39fc929c302836d488998c53c3002e</sdk:checksum>
    <sdk:url>android-1.1_r1-windows.zip</sdk:url>
    </sdk:archive>
    <sdk:archive arch="any" os="macosx">
    <sdk:size>45584305</sdk:size>
    <sdk:checksum type="sha1">e21dbcff45b7356657449ebb3c7e941be2bb5ebe</sdk:checksum>
    <sdk:url>android-1.1_r1-macosx.zip</sdk:url>
    </sdk:archive>
    <sdk:archive arch="any" os="linux">
    <sdk:size>45476658</sdk:size>
    <sdk:checksum type="sha1">c054d25c9b4c6251fa49c2f9c54336998679d3fe</sdk:checksum>
    <sdk:url>android-1.1_r1-linux.zip</sdk:url>
    </sdk:archive>
    </sdk:archives>
    <sdk:layoutlib>
    <sdk:api>4</sdk:api>
    </sdk:layoutlib>
    </sdk:platform>


     

      沿着“sdk:platform\sdk:archives\sdk:archive\sdk:url”的路径,可以找到文件地址。

    1.2 xsl转换文件

      现在数据xml已经有了,怎么才能将它按所需要的样式来显示呢?最规范的做法是使用xsl转换(XSL Transformations)。

      因为上面已经分析了数据xml的结构,我们很快就能写出对应的xsl转换文件(repository.xsl)——

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Edited with XML Spy v2007 (http://www.altova.com) -->
    <xsl:stylesheet version="1.0"
    xmlns:xsl
    ="http://www.w3.org/1999/XSL/Transform"
    xmlns:sdk
    ="http://schemas.android.com/sdk/android/repository/5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>

    <xsl:template match="/">
    <!-- 主体 -->
    <html>
    <body>
    <xsl:apply-templates/>
    </body>
    </html>
    </xsl:template>

    <xsl:template match="sdk:license">
    <!-- 许可信息 -->
    <!-- hide -->
    </xsl:template>

    <xsl:template match="sdk:platform">
    <!-- 平台 -->
    <h2>platform(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    <xsl:template match="sdk:archives">
    <!-- 文件集 -->
    <xsl:apply-templates select="sdk:archive"/>
    </xsl:template>

    <xsl:template match="sdk:archive">
    <!-- 文件 -->
    <xsl:apply-templates select="sdk:url"/>
    </xsl:template>

    <xsl:template match="sdk:url">
    <!-- 文件的URL -->
    http://dl.google.com/android/repository/<xsl:value-of select="."/><br/>
    </xsl:template>

    <xsl:template match="sdk:platform">
    <!-- 平台 -->
    <h2>platform(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    <xsl:template match="sdk:system-image">
    <!-- 系统图片 -->
    <h2>system-image(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    <xsl:template match="sdk:sample">
    <!-- 例子 -->
    <h2>sample(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    <xsl:template match="sdk:platform-tool">
    <!-- 平台工具 -->
    <h2>platform-tool(r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    <xsl:template match="sdk:tool">
    <!-- 工具 -->
    <h2>tool(r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    <xsl:template match="sdk:doc">
    <!-- 文档 -->
    <h2>doc(<xsl:value-of select="sdk:api-level"/>, r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    <xsl:template match="sdk:extra">
    <!-- 额外 -->
    <h2>extra(r<xsl:value-of select="sdk:revision"/>): <xsl:value-of select="sdk:description"/></h2>
    <xsl:apply-templates select="sdk:archives"/>
    <br />
    </xsl:template>

    </xsl:stylesheet>

      注——

    1.因数据xml使用了命名空间,所以在xsl转换文件中也得写上该命名空间,这样才能成功转换。

    2.可以配合使用“xsl:apply-templates”与“xsl:template”,让标签按规定的模板进行显示。(如“<xsl:apply-templates select="sdk:archives"/>”与“<xsl:template match="sdk:archives">”)。

    3.可以使用“<xsl:value-of select="sdk:api-level"/>”的方式获得节点的文本。这样我们就能生成标题与下载地址。

    1.3 转换指定文件

      现在已做好xsl转换文件,怎么才能用它转换xml文件呢?

      最基础的办法是,给数据xml的头部增加一行“<?xml-stylesheet type="text/xsl" href="repository.xsl"?>”,这样浏览器就能对其转换了。可是我们不能采用这种办法,因为数据xml是在官网上(https://dl-ssl.google.com/android/repository/repository-5.xml)。

      这时就得编写JavaScript脚本,来处理xml操作。

      网页的全部代码为——

    <!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 1</title>
    <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 init()
    {
    // Load XSL
    var xslRepository = xml_loadFile("repository.xsl");

    // Load main
    var xmlDoc = xml_loadFile("https://dl-ssl.google.com/android/repository/repository-5.xml");
    var divShow = getRef("divShow");
    divShow.innerHTML
    = xml_transformNode(xmlDoc, xslRepository);
    }
    </script>
    </head>
    <body onload="init()">
    <h1>Anroid SDK URL(安卓SDK地址)</h1><br />
    <div id="divShow"/>
    </body>
    </html>

      脚本其实很简单,步骤为——

    1.加载xsl转换文件。(var xslRepository = xml_loadFile("repository.xsl");)

    2.加载数据xml。(var xmlDoc = xml_loadFile("https://dl-ssl.google.com/android/repository/repository-5.xml");)

    3.指定显示的div。(var divShow = getRef("divShow");)

    4.进行转换,并将转换结果交给指定的div。(divShow.innerHTML = xml_transformNode(xmlDoc, xslRepository);)

      这里用到了2个zyllibjs_xml.js中的函数——

    xml_loadFile:xml同步/异步加载。

    xml_transformNode:xsl转换。

    1.4 小结

      运行效果为——

    [sdkurl1.png]

      成功的显示了SDK的下载地址。现在就可以将地址复制到下载工具进行下载了。

      还有可以改进的地方吗?仔细观察后发现,现在存在2点不足——

    1.浏览器卡顿。因为现在是使用同步方式下载xml的,要等到整个文件下载完后,浏览器才会恢复响应。这会严重影响用户体验。

    2.没有附加SDK。该网页中只有核心SDK,没有得附加SDK(如Google APIs)。而我们在很多时候需要用到附加SDK。

      怎么办呢?请听下回分解。

  • 相关阅读:
    MFC中,什么是CALLBACK函数,什么是WINAPI函数,二者有什么区别和联系?
    浙江移动话费计算-js代码
    [转]C#网页自动登录和提交POST信息的多种方法
    JavaScript小数四舍五入toFixed
    C#.NET应用程序实现网页自动登录
    VC改变对话框按钮字体颜色和背景的解决方案(转)
    WPF窗口阴影
    用MVVM模式开发中遇到的零散问题总结(1)
    NPOI之Excel——合并单元格、设置样式、输入公式
    近距离接触RAC DRM
  • 原文地址:https://www.cnblogs.com/zyl910/p/android_sdk_url1.html
Copyright © 2011-2022 走看看