免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3279 | 回复: 7
打印 上一主题 下一主题

最近研究ajaxslt的心得 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-06 10:34 |只看该作者 |倒序浏览
最近需要在javascript中控制xml数据,前段时间用dojo,但这玩意是在是太重了,太重的东西有种本能的抗拒
现在又想找点轻型的库来用,prototype、script.aculo.us和ajaxslt就是我看了半天之后的选择,这里单说ajaxslt

ajaxslt是google提供的js库,bsd协议,可以放心使用,而且google也用在了gmail、google map这些产品上,所以还是很可靠的。唯一不爽的就是资料几乎没有,只有几篇很简单的文章说一下大概用法,其实这东西也不复杂,但是资料太少不易消除初学的恐惧。
资料少就只好自己读代码了,读代码的时候看到如下注释

  1. // Parses the given XML string with our custom, JavaScript XML parser. Written
  2. // by Steffen Meschkat (mesch@google.com).

  3.   // For the record: in Safari, we would create native DOM nodes, but
  4.   // in Opera that is not possible, because the DOM only allows HTML
  5.   // element nodes to be created, so we have to do our own DOM nodes.
复制代码

不得了,google的哥们就是牛啊,原来是完全写了个js原生的xml实现。
下面就零零碎碎的说一下看到的东西

  1. function XNode(type, name, opt_value, opt_owner) {
  2.   this.attributes = [];
  3.   this.childNodes = [];

  4.   XNode.init.call(this, type, name, opt_value, opt_owner);
  5. }

  6. // Don't call as method, use apply() or call().
  7. XNode.init = function(type, name, value, owner) {
  8.   this.nodeType = type - 0;
  9.   this.nodeName = '' + name;
  10.   this.nodeValue = '' + value;
  11.   this.ownerDocument = owner;

  12.   this.firstChild = null;
  13.   this.lastChild = null;
  14.   this.nextSibling = null;
  15.   this.previousSibling = null;
  16.   this.parentNode = null;
  17. }
复制代码

这个地方用call方法做了一个构造函数,从这里可以看出node类型的属性就是这些了。和平时用的DOM模型不同,这里没有tagName,代替为nodeName

  1. function XDocument() {
  2.   // NOTE(mesch): Acocording to the DOM Spec, ownerDocument of a
  3.   // document node is null.
  4.   XNode.call(this, DOM_DOCUMENT_NODE, '#document', null, null);
  5.   this.documentElement = null;
  6. }

  7. XDocument.prototype = new XNode(DOM_DOCUMENT_NODE, '#document');
复制代码

Document也作为一个节点对待,这逻辑也没错,根节点嘛,整个xml全部抽象成节点集合,干得漂亮!
没看过其它DOM实现的代码是不是这么干的,我是脚本技术原教旨主义分子,想看也看不懂……

常见的dom api都有了,appendChild() replaceChild() getElementsByTagName() ....
但是没有insertAfter(),只有insertBefore(),干脆DIY一个

  1. XNode.prototype.insertAfter = function(newNode, oldNode){
  2.     if (oldNode == newNode){ return; }

  3.     if (newNode.parentNode) {
  4.         newNode.parentNode.removeChild(newNode);
  5.     }

  6.     var newChildren = [];
  7.     for (var i = 0; i < this.childNodes.length; i++){
  8.         var c = this.childNodes[i];
  9.         newChildren.push(c);
  10.         if (c == oldNode) {
  11.             newChildren.push(newNode);

  12.             newNode.parentNode = this;

  13.             newNode.nextSibling = oldNode.nextSibling;
  14.             if (newNode.nextSibling) {
  15.                 newNode.nextSibling.previousSibling = newNode;
  16.             }
  17.             oldNode.nextSibling = newNode;
  18.             newNode.previousSibling = oldNode;

  19.             if (this.lastChild == oldNode) {
  20.                 this.lastChild = newNode;
  21.             }
  22.         }
  23.     }
  24.     this.childNodes = newChildren;
  25. }
复制代码

再来DIY点好用的

  1. // 返回所有xpath查询结果
  2. XDocument.prototype.selectNodes = function(/* string */xpathString){
  3.     var expr = xpathParse(xpathString);
  4.     var result = expr.evaluate(new ExprContext(this));
  5.     return result.nodeSetValue();
  6. }

  7. // 返回第一个xpath查询结果
  8. XDocument.prototype.selectNode = function(/* string */xpathString){
  9.     var result = this.selectNodes(xpathString);
  10.     return result.length ? result[0] : null;
  11. }
复制代码

selectNodes()包含了xpath的使用方法,凑合着参考吧
你可以这样写

  1. // 获取所有require属性等于1的aaa元素
  2. var node = xmldoc.selectNodes('//aaa[@require=1]');
  3. // 获取第一个require属性等于1的aaa元素
  4. var node = xmldoc.selectNode('//aaa[@require=1]');
复制代码


好用的函数,xmlValue()和xmlText()
用xmlValue()获得元素的文字内容,你就不用node.firstChild.nodeValue这么麻烦了,直接xmlValue(node)完事
xmlText()返回xml文本,参数可以用node,也可以用document

暂时就这么多,ajaxslt感觉还是不错的,js原生,不用考虑那么多浏览器DOM实现差异了
Hell is another browser!!!

论坛徽章:
0
2 [报告]
发表于 2007-04-06 11:43 |只看该作者
不错,,为啥不用jquery。。

论坛徽章:
0
3 [报告]
发表于 2007-04-06 12:07 |只看该作者
这玩意儿现在能在 IE 上用了吗? 我差不多一年前试过, 那时候只支持 Firefox.

不过 xpath... 还真是不好用, 仅仅是和客户端交互的话还是 json 吧

论坛徽章:
0
4 [报告]
发表于 2007-04-06 12:10 |只看该作者
Jquery

论坛徽章:
0
5 [报告]
发表于 2007-04-06 15:19 |只看该作者
性能如何?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2007-04-06 17:41 |只看该作者
原帖由 lyhiving 于 2007-4-6 12:10 发表
Jquery

jquery大抵相当于prototype + script.aculo.us
jquery能够load一段xml,然后返回一个XML Document对象?我大概浏览了一遍API,办不到,更何况ajaxslt还有xlst
jquery能够操作的dom对象仅限于HTML Document
原帖由 cid73 于 2007-4-6 12:07 发表
这玩意儿现在能在 IE 上用了吗? 我差不多一年前试过, 那时候只支持 Firefox.
不过 xpath... 还真是不好用, 仅仅是和客户端交互的话还是 json 吧

ie上工作正常,暂时没发现和firefox有什么区别
我把xml作为客户端数据库(姑且这么叫吧)使用,在客户端上全部做好了才向服务器端一次提交,json貌似和这个主题无关

性能没有测试过,感觉gmail都在用,应该可以吧

[ 本帖最后由 夜猫子 于 2007-4-6 17:45 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-04-06 19:32 |只看该作者
原帖由 james.liu 于 2007-4-6 11:43 发表
不错,,为啥不用jquery。。


搞的太臃肿了。。

论坛徽章:
0
8 [报告]
发表于 2007-04-06 19:39 |只看该作者
听不懂在说什么啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP