`
hax
  • 浏览: 961435 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

写了一个XML Base的JS实现(简介篇)

    博客分类:
  • AJAX
阅读更多
最近想在一个小应用中采用浏览器端的xinclude。找了一下,居然没有找到现成的实现。所以就打算自己写一个。

完整的xinclude实现也需要用到一些其它技术。最基本的就是xml base。

在html中你的链接如果不是absolute url形式,就需要相对于文档位置或者文档中用base元素定义的base url来resolve。

xml base和html的base有点类似,但是更加灵活,通过xml:base属性而不是单独一个属性来设置,所以可以有层次。例如:

<?xml version="1.0"?>
<doc xml:base="http://example.org/today/"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <head>
    <title>Virtual Library</title>
  </head>
  <body>
    <paragraph>See <link xlink:type="simple" xlink:href="new.xml">what's
      new</link>!</paragraph>
    <paragraph>Check out the hot picks of the day!</paragraph>
    <olist xml:base="/hotpicks/">
      <item>
        <link xlink:type="simple" xlink:href="pick1.xml">Hot Pick #1</link>
      </item>
      <item>
        <link xlink:type="simple" xlink:href="pick2.xml">Hot Pick #2</link>
      </item>
      <item>
        <link xlink:type="simple" xlink:href="pick3.xml">Hot Pick #3</link>
      </item>
    </olist>
  </body>
</doc>


这个示例代码抄自于xml base规范。其中的xlink解析后如下:
    *      "what's new" resolves to the URI "http://example.org/today/new.xml"
    *      "Hot Pick #1" resolves to the URI "http://example.org/hotpicks/pick1.xml"
    *      "Hot Pick #2" resolves to the URI "http://example.org/hotpicks/pick2.xml"
    *      "Hot Pick #3" resolves to the URI "http://example.org/hotpicks/pick3.xml"

原理还是一目了然的。但是要做出一个完全符合标准,并且鲁棒的实现也不是很容易的。

首先是确定我们的API。

API决定了我们如何利用xml base。

本身xml base是很简单的,你可以直接在xml文档中加入xml:base属性即可。然后就是application的问题了。比如你使用xlink,或者xinclude,或者其它属性(比如各种xml格式中常见的链接)——关键是应用是否能利用它来算出每个链接(有可能是relative URI)的最后的absolute形式。

所以API就呼之欲出了。

对于xml文档中的一个uri,其要么是在文本(text node或cdata中),要么是在属性中(实际上还有其它,如entity,PI等,我们暂时忽略)。那么我们的参数就是uri,和uri所在的node,我们希望得到的,就是最后的absolute uri。如下:

resolveURI(node, uri)

从node开始,我们可以根据xml base算出其 base URI。所谓base URI,是URI规范(RFC2369)中的术语,relative URL是根据base URI进行resolve的。xml base中得到一个node的base URI的大体算法如下:

如果这个node是text node或cdata,其base URI就是该node的parentNode,也就是一个element的base URI。

如果这个node是attr,其base URI就是该attr所属的element。

如果这个node是element,那么如果它有xml:base属性,那base URI就是xml:base属性所表达的URI——注意xml:base属性也可以是relative URI,所以它自身也要根据更上一级的base URI来resolve。如果没有xml:base属性,那其base URI就是父元素(或者最上层的document节点)的base URI。注意,有时候可能没有父节点,比如这个node刚创建出来还没有插入DOM树,或者已经被从DOM树上remove了,这个时候base URI就是null。

如果这个node是document,则其值为documentURI,通常是document的资源地址,但是有时候是null,例如你是从内存中产生的,或者从字符串parse出来的。

这个算法其实比较简单,就是递归向上找。

实际上,DOM中已经有这样一个baseURI属性了。

DOM Level 3增加了Node.baseURI属性,用来返回一个节点的baseURI。所谓baseURI,是由XML infoset所规定的一个xml属性,其计算方式就是根据xml base规范来的(你可以看到,w3c的规范是一个规范集合,互相独立但是又紧密关联),也就是我上面描述的过程。

Firefox 2.0虽然没有完全支持DOM Level 3,但是它是支持xml base规范和baseURI属性的。Safari 3也是支持的(虽然其支持有些问题,后述)。

显然,你料到了,IE 6不支持baseURI。

其它浏览器,如IE 7,Opera等,我暂时未及测试。有兴趣的同志可以测一下。

为了兼容IE 6和其它不支持baseURI属性的,我又定义了

baseURI(node)

其含义等价于DOM Level 3的 Node.baseURI。

API好了之后,我们就可以实现它了(当然其实应该先写测试用例,呵呵)。

代码明天再发。
2
0
分享到:
评论

相关推荐

    base64,java与JavaScript实现

    ### 关于Base64编码及Java与JavaScript的实现 #### Base64简介 Base64是一种将二进制数据转换为ASCII字符串表示形式的方法。它主要用于处理非文本数据的存储和传输,例如图像、视频等多媒体文件。由于互联网传输...

    JS传递XML文件

    标题“JS传递XML文件”指的是如何在JavaScript中构建一个机制,安全地将XML数据传输到ASP.NET后端。描述中提到的问题是ASP.NET在接收到请求时检测到可能含有HTML标记或脚本的数据,这可能引发安全问题。因此,我们...

    js xml转换execl

    XML是一种结构化数据格式,而Excel则是一个流行的电子表格应用程序,用于存储、管理和分析数据。本篇文章将深入探讨如何在JavaScript环境中进行XML与Excel之间的转换。 1. **XML转Excel**: - **基本概念**:XML...

    JS 实现Base64编码与解码实例详解

    Js实现Base64编码与解码 Base64其实是一种简单的置换加密方式,但是BASE64的用处往往并不是为了防止信息泄露,而且为了方便传输,进过BASE64编码后的信息会比原始信息长,大概是4/3倍。 Base64是一种基于64个可打印...

    小程序base64解析

    1. **Base64编码原理**:Base64是基于64个字符的编码系统,包括大小写字母、数字和两个特殊符号('+', '/'),以及一个分隔符'='。每个6位的二进制数据块被转换为对应的Base64字符,不足6位的则用0填充。最后,如果...

    json数据base64编码压缩+解压解码(java以及js)

    java端:返回类型非字符接口调用StringUtils#base64AndCompressJson进行编码压缩 ,返回类型为字符接口调用StringUtils#base64Andcompress js 端:引入压缩包中的js文件 ,调用deBase64AndUncompress进行解压解码

    js-base64 20150121_javascriptbase64_carry9i1_jsbase64_64cacom_

    在给定的`js-base64 20150121_javascriptbase64_carry9i1_jsbase64_64cacom_`这个压缩包中,我们预计会找到一个JavaScript实现的Base64库,可能被用于在浏览器环境中进行Base64编码和解码。 Base64算法的核心原理是...

    PDF和Base64格式互相转换

    它将每3个字节的数据拆分为4个6位的“单词”,然后将每个6位的数字映射到一个特定的字符,从而形成可打印的ASCII字符串。 PDF与Base64之间的转换涉及到文件处理和数据编码的知识点: 1. **PDF转Base64**: 当你...

    图片和XML格式互换

    2. 创建XML结构:接下来,构建一个XML文件结构,将Base64编码的图片数据作为值插入到XML元素中。例如: ```xml &lt;filename&gt;example.jpg &lt;width&gt;800 &lt;height&gt;600 &lt;created&gt;2022-01-01 此处填写Base64编码的...

    JavaScript+xml实现下拉二级联动菜单

    本文将详细介绍如何利用JavaScript和XML来构建一个具有二级联动功能的下拉菜单。此菜单的一个显著优势是它能够覆盖网页上的任何元素,包括`select`、`object`或`flash`等,这使得它在复杂布局中更为实用。 ##### ...

    文件转化为base64字符串

    这64个字符包括大小写字母(A-Z, a-z)、数字(0-9)以及两个特殊符号(+ 和 /),还有一个等于号(=)用于填充。每个字符代表6位二进制值,因此每3个字节(24位)的数据会被拆分成4个6位的块进行编码。如果原始数据...

    Base64 加密解密小工具

    总的来说,Base64是一种在不同系统之间传输二进制数据的便捷手段,而“Base64 加密解密小工具”则为用户提供了一个方便快捷的实现这一功能的平台。通过理解和熟练运用这类工具,可以更好地处理各种涉及二进制数据...

    用XMLDOM和ADODB.Stream实现base64编码解码实现代码

    在本文中,我们将深入探讨如何使用XMLDOM和ADODB.Stream对象在JavaScript中实现Base64编码和解码。Base64是一种用于将二进制数据转换为ASCII字符串的编码方法,常用于在网络上传输非ASCII字符的数据,如图片或文件。...

    Base64.js-master js上传文件插件源码,有需要的小伙伴可以下载

    Base64.js-master 是一个JavaScript库,主要用于处理Base64编码和解码,同时也被用于文件上传功能。在Web开发中,特别是在不支持File API或者FormData的旧版浏览器中,Base64编码常用于将二进制数据转换为可安全传输...

    js实现导出文本和图片(images和canvas)到word文档

    在JavaScript中实现将文本和图片(包括常规的images和canvas绘制的图像)导出到Word文档,是一项常见的需求,尤其在网页应用中。...这是一个多方面综合的技术挑战,但通过适当的工具和策略,可以有效地解决。

    WebApi返回xml格式时去除命名空间

    要实现这个目标,我们可以自定义一个XML序列化器,继承自`System.Xml.Serialization.XmlSerializer`,然后重写其`Serialize`方法来控制XML的生成过程。以下是一个简单的示例: ```csharp public class ...

    js+html5拍照压缩图片上传.rar_Base64 js插件_html5图片上传_js 拍照_js 拍照证件_js拍照上传

    这个"js+html5拍照压缩图片上传.rar"的压缩包就是一个典型的例子,它集成了Base64编码、JS插件、HTML5的图片处理功能以及JS拍照上传的解决方案。下面我们将详细探讨这些知识点。 首先,`Base64`是一种用于在网络上...

    base64转Mp4工具.zip

    【base64转Mp4工具.zip】是一个压缩包文件,其中包含了将Base64编码的文本转换为MP4视频格式的工具。这个工具的主要目的是帮助用户处理已经编码为Base64格式的视频数据,将其解码并转换为可播放的MP4文件。Base64是...

    Js实现Base64编码与解码

    Base64编码是一种数据编码方法,它将任意的二进制数据转换成由64个可打印字符组成的编码,这些字符包括大写字母A-Z、小写字母a-z、数字0-9以及加号(+)和斜杠(/),还有一个等号(=)作为填充字符。由于Base64编码将每3...

    PHP+JS Base64和URI编码解码

    首先,定义了一个包含中文字符的字符串,然后用`base64_encode()`进行编码,输出编码后的结果,再通过`base64_decode()`解码回原始数据。 如果`demo.php`文件还涉及到URI编码,那么可能会有类似以下的代码: ```...

Global site tag (gtag.js) - Google Analytics