www.nangeblog.com

一斛酒 品人生沉浮 平常心 造万千世界 人生天地之间 若白驹之过隙 忽然而已

posts - 77,comments - 102,trackbacks - 0

  最近做的一个项目中运用 xml 数据岛技术,所以把数据岛方面的知识总结一下。

  XML 数据岛 data islands )就是被 html 页面引用或者包含的 xml 数据,是从 IE5 开始引入的一项技术。可以通过 xml 标签很轻松将数据岛插入到 html 文档中。那么怎么访问 xml 数据岛的数据呢,很简单,通过 xml id 。在页面中的数据岛和其他的 xml 数据一样,可以通过标准的dom 方法来进行访问。

   数据岛的优点是可以很容易的将 xml 中的数据和 html 元素进行绑定,免去了手工把数据填充到 html 中的麻烦。修改数据岛中的数据,页面上与之绑定的html元素的值也随之改变。 OK ,先来看个数据岛之 Hello World 版,

  数据岛其实就是一串 xml ,必须要用 xml 标签围起来,示例如下:

<xml id= "island" >

<root>

   <p1>
   
<name> magicdoom </name>

    <age> 24 </age>

    <email> magicdoom@gmail.com </email>

   </p1> 
</root>

</xml>

数据岛有两种定义方式,一种是直接将上述 xml 嵌入到 html 页面中,另一种是见 xml 数据保存在单独的 xml 文件中,在页面只需嵌入 <xml id= "island" src= "xxx.xml" ></xml>

其中的 src 属性值为保存 xml 数据的那个文件的位置。

   如何将上面定义好的 xml 数据岛绑定到 html 控件上呢?答案是通过 datasrc datafld 属性,下面是一个将 xml 数据岛绑定到 html 控件上的示例:

<table width= "100%" datasrc= "#island" >

 

<thead>

 

      <tr>

 

            <th> Name </th>

 

            <th> Age </th>

 

            <th> Email </th>

 

      </tr>

 

</thead>

 

<tbody>

 

      <tr>

 

            <td align= "center" ><span  datafld= "name" ></span></td>

 

            <td align= "center" ><span datafld= "age" ></span></td>

 

            <td align= "center" ><span datafld= "email" ></span></td>

 

       </tr>

 

</tbody>

 

</table>

例中 table datasrc 属性的 value xml 数据岛中的定义的 id ,注意必须要在前头加上 #

表格中的 datafld 属性对应于 xml 中的元素的名称。

将上述数据岛和 html 代码保存到一个 html 文件中,在 IE 中打开,可以看到结果如下:

Name

Age

Email

magicdoom

24

magicdoom@gmail.com

               

下面我们来看看在 javascript 中怎样通过DOM访问数据岛中的数据

 

xmldoc = island;     // 取数据岛

var rootElement = xmldoc.documentElement.firstChild;  // 取根元素

 

// 实现打印出数据岛中第一个元素的值

  if (rootElement.hasChildNodes())

 

  alert (rootElement.firstChild.text) ;

 

// 创建一个新的元素,添加到数据岛中

var test = xmldoc.createElement( 'test' );

 

  var testTxt = xmldoc.createTextNode( "This is a test!" );

 

  test.appendChild(testTxt);

 

  rootElement.appendChild(test);

  alert (rootElement.lastChild.text) ;

 

// 删除数据岛中的一个元素

rootElement.removeChild(rootElement.lastChild) ;

 

// 修改数据岛中的一个元素的值

rootElement.firstChild.text= "new value" ;

 

//查找xml元素 使用getElementsByTagName返回一个element的数组
rootElement.getElementsByTagName("name")(0).text 


//测试数据岛绑定的效果
在页面中定义<button  onclick="testDSO()">testDSO</button>
function  testDSO()
{
 rootElement.getElementsByTagName("name")(0).text="modefied name";
}
//点击按钮后就会发现页面上的Name的值也随之改变
 

     XML 数据岛的应用很容易和其他的技术进行结合。我当前做的一个项目中,就是和 HTC 以及 XmlHttp 技术进行结合。 htc 做了一些功能强大的控件(比如Tree非常好用),底层通过XmlHttp 与后台的服务器进行交互,可以达到无刷新提交页面。前台通过js来操纵页面中的数据岛和发送数据到后台的java类,项目的 框架支持在js调用后台 java 类的方法,有点类似于 DWR 。后台的 java 类返回 XML 数据到前台的 js js 再将xml数据注入到页面的数据岛中。
   项目采用的框架是国内的一家公司的商业产品,
通过几个月的实际使用,虽然还有一些问题,但是这个框架确实是大大提高了开发效率。

最后总结一下 xml 数据岛的最大优点是可以和html元素进行绑定,修改数据岛中的数据,与之绑定的html元素的值也会随之改变。但是也要看到它的缺点:

1.只能在 IE 下运行,firefox等其他的浏览器下无法使用。

2.安全性, xml 数据岛可以通过查看 html 的源代码获取。

 

另:在 DWR 中,提供有一些便捷的 js 函数,可以将后台 java 方法传回的 json 格式的 js 对象的属性值,赋给 html 页面中的 html 元素, dwr 会根据 html 元素的 id 进行自动赋值。这种方式也蛮简单方便的。


源代码下载http://www.blogjava.net/Files/magicdoom/island.rar


posted on 2006-03-01 10:18 南哥 阅读(2058) 评论(5)  编辑  收藏 所属分类: AJAX

FeedBack:
# re: XML数据岛技术的总结
2006-03-01 13:39 | emu
>>后台的java类返回XML数据到前台的js,js再将数据岛绑定到页面上
后台返回xml数据是用数据岛的形式引用,还是用js的接受xml数据后灌到数据岛里面去?  回复  更多评论
  
# re: XML数据岛技术的总结
2006-03-01 15:53 | magicdoom
是在js中将后台返回的xml格式的数据注入到数据岛里面
类似代码

//解析xml数据,返回document对象
xmlRtnDoc=loadXml(arg); //arg为后台返回的xml数据

//island为数据岛中的id
island.removeChild(island.documentElement);
island.appendChild(xmlRtnDoc.selectSingleNode("//root"));


  回复  更多评论
  
# re: XML数据岛技术的总结
2006-09-04 15:41 | dream
整个程序应该是怎样的???我把你上面的程序组织到一起了,可是运行不出来。希望能帮个忙,我是刚开始学,觉得你的这篇文章很好,适合初学者。  回复  更多评论
  
# re: XML数据岛技术的总结
2006-09-04 17:27 | magicdoom
可以加我的MSN: magicdoom@gmail.com 大家一起交流一下!  回复  更多评论
  
# re: XML数据岛技术的总结
2008-02-20 17:04 | silence1997@live.cn
很好我也是刚刚血  回复  更多评论
  

标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-06 17:36 编辑过