在jquery中处理带有命名空间的XML数据


Posted in Javascript onJune 13, 2011

但不幸的是,很多服务返回的数据仍然是XML格式的。
jquery对于xml这种数据的处理是内置支持的,这一点没有任何问题。但前提是返回的数据没有带任何命名空间。例如下面这份数据

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
<Employee id="1" firstName="ares" lastName="chen"></Employee> 
</data>

要处理这样的数据,jquery代码大致如下
var div = $("#placeholder"); 
// 处理不带命名空间的xml 
$.get("data.xml", null, function (data) { 
var employees = $("Employee", data); //找到所有的Employee节点 
var ul = $("<ul />"); 
employees.each(function () { 
$("<li />").text($(this).attr("firstName") + " " + $(this).attr("lastName")).appendTo(ul);// 将每一行数据构造一个新的li标签,并且将其插入到ul中 
}); 
ul.appendTo(div); 
});

但如果我们的XML数据带有命名空间,则上述代码就会无效。原因是因为jquery默认处理不了命名空间\
<?xml version="1.0" encoding="utf-8" ?> 
<data xmlns:d="http://tech.xizhang.com"> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
<d:Employee id="1" firstName="bill" lastName="gates"></d:Employee> 
</data>

为了解决这个问题,有热心的网友,编写了一个jquery插件,叫做jquery.xmlns.js,有兴趣可以通过下面了解和下载
http://www.rfk.id.au/blog/entry/xmlns-selectors-jquery/
那么,我们可以用如下的方法来解决问题
$.xmlns["d"] = "http://tech.xizhang.com"; 
// 处理带命名空间的xml 
$.get("datawithnamespace.xml", null, function (data) { 
var employees = $("d|Employee", data); //找到所有的Employee节点 
var ul = $("<ul />"); 
employees.each(function () { 
$("<li />").text($(this).attr("firstName") + " " + $(this).attr("lastName")).appendTo(ul); 
}); 
ul.appendTo(div); 
});

不得不说,XML这个技术规范中的命名空间真是一个很不好的设计。增加了很多麻烦,胜过于它带来的好处。
本文的例子完整代码如下
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title></title> 
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 
<script src="Scripts/jquery.xmlns.js" type="text/javascript"></script> 
<script language="javascript" type="text/javascript"> 
$(function () { 
var div = $("#placeholder"); 
// 处理不带命名空间的xml 
$.get("data.xml", null, function (data) { 
var employees = $("Employee", data); //找到所有的Employee节点 
var ul = $("<ul />"); 
employees.each(function () { 
$("<li />").text($(this).attr("firstName") + " " + $(this).attr("lastName")).appendTo(ul);// 将每一行数据构造一个新的li标签,并且将其插入到ul中 
}); 
ul.appendTo(div); 
}); 
$("<br />").appendTo(div); 
$.xmlns["d"] = "http://tech.xizhang.com"; 
// 处理带命名空间的xml 
$.get("datawithnamespace.xml", null, function (data) { 
var employees = $("d|Employee", data); //找到所有的Employee节点 
var ul = $("<ul />"); 
employees.each(function () { 
$("<li />").text($(this).attr("firstName") + " " + $(this).attr("lastName")).appendTo(ul); 
}); 
ul.appendTo(div); 
}); 
}); 
</script> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div id="placeholder"> 
</div> 
</form> 
</body> 
</html>

最后,在浏览器中看到的效果如下。有图有真相

在jquery中处理带有命名空间的XML数据

Javascript 相关文章推荐
Javascript结合css实现网页换肤功能
Nov 02 Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
jQuery中prepend()方法使用详解
Aug 11 Javascript
JS实现仿苹果底部任务栏菜单效果代码
Aug 28 Javascript
谈谈javascript中使用连等赋值操作带来的问题
Nov 26 Javascript
js原生跨域_用script标签的简单实现
Sep 24 Javascript
jQuery实现CheckBox全选、全不选功能
Jan 11 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
vue项目关闭eslint校验
Mar 21 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
Feb 12 Javascript
详解Vue依赖收集引发的问题
Apr 22 Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 Javascript
jquery 与NVelocity 产生冲突的解决方法
Jun 13 #Javascript
用Juery网页选项卡实现代码
Jun 13 #Javascript
读jQuery之三(构建选择器)
Jun 11 #Javascript
读jQuery之二(两种扩展)
Jun 11 #Javascript
读jQuery之一(对象的组成)
Jun 11 #Javascript
基于jquery的无刷新分页技术
Jun 11 #Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 #Javascript
You might like
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
php中看实例学正则表达式
2006/12/25 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
destoon复制新模块的方法
2014/06/21 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
php生成mysql的数据字典
2016/07/07 PHP
PHP线程的内存回收问题
2016/07/08 PHP
phpStorm2020 注册码
2020/09/17 PHP
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
使用js画图之画切线
2015/01/12 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
python基础while循环及if判断的实例讲解
2017/08/25 Python
python tkinter组件使用详解
2019/09/16 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
在keras里实现自定义上采样层
2020/06/28 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
什么是Python包的循环导入
2020/09/08 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
如何在C# winform中异步调用web services
2015/09/21 面试题
生物科学专业毕业生求职信
2014/06/02 职场文书
拉拉队口号
2014/06/16 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
村主任当选感言
2015/08/01 职场文书
初中团支书竞选稿
2015/11/21 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
python b站视频下载的五种版本
2021/05/27 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js