lotus/Domino 中应用xml 异步读取数据
W3C已经指定了一个XML的标准文档对象模型。DOM是用于HTML和XML文档的程序开发接口,它能够让开发者访问和操作一个文档。开发者可以使用DOM建立和浏览文档。有很多可利用的方法和属性,如下表所示:
* Basename:返回一个节点的名称。
* childNodes:返回包含选择节点的所有子节点的列表。
* lastChild:返回当前节点的最后子节点。
* nextSibling:返回当前节点之后的一个节点。如果二者是同一父母,则它们为同胞关系。
* parentNode:返回一个节点的父母节点。如果是根节点,则返回Null。
* text:返回一个节点及其子节点的文本内容。
* xml:返回一个节点及其子节点的XML内容。
* hasChildNodes:对一个节点是否包含子节点,返回相应的true或false。
* nextNode:返回一个集合的下一节点。
* previousNode:返回一个集合的前一节点。
* selectNodes:返回与特定模式匹配的包含所有节点的一个NodeList对象。
* selectSingleNode:返回与特定模式匹配的第一个子节点的节点对象。
在domino中的应用举例:
1.在test.nsf 库中写一个getxml代理
Sub Initialize
Dim xmlStr As String
xlmStr=|<?xml version="1.0" encoding="GB2312" standalone="yes"?><root>|
xlmStr=xlmStr & |<item><name>刘亦菲1</name><url>MingXing/LiuYiFei.htm</url><color>7A9D4B</color></item>|
xlmStr=xlmStr & |<item><name>蔡依林</name><url>MingXing/CaiYiLin.htm</url><color>FD0000</color></item>|
xlmStr=xlmStr & |<item><name>张娜拉</name><url>MingXing/ZhangNaLa.htm</url><color>7A9D4B</color></item>|
xlmStr=xlmStr & |<item><name>张韶涵</name><url>MingXiang/ZhangShaoHan.htm</url><color>0000FF</color></item>|
xlmStr=xlmStr & |<item><name>张靓颖</name><url>MingXing/ZhangLiangYin.htm</url><color>7A9D4B</color></item>|
xlmStr=xlmStr & |<item><name>李宇春</name><url>MingXing/LiYuChun.htm</url><color>7A9D4B</color></item>|
xlmStr=xlmStr & |</root>|
Print "content-type:text/xml;charset=GB2312"
Print xlmStr
End Sub
2.表单中加上以下js代码
<script language="javascript" type="text/javascript">
var xmlHttp;
//创建一个XmlHttpRequeset对象
function createXMLHttpRequest(){
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
}
//开始一个请求
function startRequest(){
createXMLHttpRequest();
xmlHttp.onreadystatechange = handlestatechange;
xmlHttp.open("POST", ":81/test/test.nsf/getxml?openagent", true); //提交代理请求
xmlHttp.Send(null);
}
function handlestatechange(){
if(xmlHttp.readyState == 4){//描述一种"已加载"状态;此时,响应已经被完全接收。
if(xmlHttp.status == 200){//200表示成功收到
var xmldoc = xmlHttp.responseXML;
var node1 = xmldoc.selectSingleNode('root/item/name');//返回与特定模式匹配的第一个子节点的节点对象
var node2=xmldoc.selectNodes("root/item");//返回与特定模式匹配的包含所有节点的一个NodeList对象
var txt;
for(i=0;i<node2.length;i++){
if(node2!=null){
var childNode=node2[i].childNodes; //返回包含选择节点的所有子节点的列表
txt=childNode[0].text+";"+childNode[1].text+";"+childNode[2].text; //返回一个节点及其子节点的文本内容,每个item有三个子节点:name,url,color三个。
}
alert(txt);
}
}
}
}
</script>
调用js函数:
<body text="#000000" bgcolor="#FFFFFF">
<input type="button" onClick="startRequest()" name="Submit" value="提交">
</body>
自己分析体会:
看看startRequest函数。我们发现xmlHttp.onreadystatechange指向了一个函数,这个函数是在xmlHttpRequest.readyState发生改变的时候触发。我们再来看startRequest函数,想象一下整个请求发送的步骤。现在我们点击一个按钮,触发了一个startRequest函数。函数往下走,第一步是createXmlHttpRequest(),它的作用是创建一个xmlHttpRequest对象,当它完毕的时候,xmlHttpRequest.readyState的值是0(window.alert跟踪得到的),程序继续往下走,xmlHttp.onreadystatechange = handlestatechange,因为状态没有改变(xmlHttpRequest.readyState的值是0),所以不触发函数,紧接着是Open()和Send(),那么,整个函数从头到尾都应该没有触发handlestatechange函数啊,但是为什么出来的结果是正确的呢?
后来我用window.alert跟踪xmlHttp.readystate的变化,发现于原来它运行的机制是这样的。首先创建一个xmlHttpRequest的对象之后xmlHttp.readyState的值是0了,然后xmlHttp.onreadystatechange = handlestatechange没有运行。紧接着是open(),这个函数发生了之后xmlHttp.readyState的值是1了,那么就会有一个断点在Open()函数处断开,保留现场,紧接着又返回到xmlHttp.onreadystatechange = handlestatechange运行,然后再执行Send()函数,这个函数发生了之后xmlHttp.readyState的值是2了,接着又返回到xmlHttp.onreadystatechange = handlestatechange运行。以此类推。
=====================================