以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 HTML/XHTML/Ajax/Web 2.0/Web 3.0 』  (http://bbs.xml.org.cn/list.asp?boardid=22)
----  [求助]如何让Ajax读取本地的xml文件进行更新网页  (http://bbs.xml.org.cn/dispbbs.asp?boardid=22&rootid=&id=36657)


--  作者:huoniao
--  发布时间:8/11/2006 1:26:00 AM

--  [求助]如何让Ajax读取本地的xml文件进行更新网页
我正在学习Ajax,编写一个html
部分代码如下:
... ...
function AjaxRead(fileName){
    var myXmlObj = null;
    if(window.XMLHttpRequest){
        myXmlObj = new XMLHttpRequest();
    } else if(window.ActiveXObject){
        myXmlObj = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        return;
    }
    myXmlObj.onreadystatechange = function(){
        if(myXmlObj.readyState == 4){
            updateObj('testXmlObj',myXmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data);
        }
    }
    myXmlObj.open ('GET', file, true);
    myXmlObj.send ('');
}
function updateObj(obj, data){
    document.getElementById(obj).firstChild.data = data;
}

... ...

<p id="testXmlObj">
test Ajax<a href="testdata.xml"title="Test Ajax" onclick="AjaxRead('testdata.xml'); this.style.display='none'; return false">
Ajax</a>
</p>
... ...
这样是好用的,可以局部更新网页。
但我想让Ajax或者说让XMLHttpRequest读取本地的xml文件,进行如下改动(黑色部分)
<p id="testXmlObj">
test Ajax<a href="file:///C:/testdata.xml"title="Test Ajax" onclick="AjaxRead('file:///C:/testdata.xml'); this.style.display='none'; return false">
Ajax</a>
无论是把 myXmlObj.open ('GET', file, true);改成 myXmlObj.open ('', file, true);
或者使用ADO Stream读取文件
    ... ...
    //myXmlObj.open ('GET', file, true);
    //myXmlObj.send ('');
    var ado_stream = new ActiveXObject("ADODB.Stream");
    ado_stream.Open();
    ado_stream.LoadFromFile(file);
    xmlObj.responseXML.loadXML( ado_stream.Read(0) );

    myXmlObj.send ('');
执行的效果只是把testdata.xml文件给打开了,而没有达到局部更新网页的效果
请问各位高人,如何解决?
我是刚接触web编程,请各位不吝赐教,谢谢大家了


--  作者:upc2neiep
--  发布时间:8/11/2006 4:30:00 PM

--  
不说其他的,本地文件为什么还要用Ajax。。。。
--  作者:cwzb
--  发布时间:8/13/2006 3:14:00 PM

--  
执行的效果只是把testdata.xml文件给打开了,而没有达到局部更新网页的效果
//你这话问得怪....

AJAX=XMLHTTP+JAVASCRIPT

这个要明确.

第二

AJAX,是一个通道,提供你的数据流进流出的...而不是帮你更新页面的..

如果你想要通过XML的加载来更新页面数据,你需要学习我的OPS

我写一段WEI代码:
var ps = new OPS();    //申明一个OPS对象
var xml = ajax.read("http://aaa/aaa.xml");//使用AJAX这个通道把数据取出
ps.load(xml);//通过OPS,把XML数据加载到页面上,达到页面数据更新.

//上面只是一段WEI代码,要说明的一点,就是在AJAX的基础上,你必须有代码把XML数据绑到页面上.
//另外,OPS,提供了一个通过的引擎.并且对XML也定义了格式规范.


--  作者:cwzb
--  发布时间:8/13/2006 3:21:00 PM

--  
下面,是一段OPS格式的XML数据,可以试一下,把下面的代码复制出来.
打开 (http://www.cwzb.name/ops_client/3_0/demo/psc.htm) 这个页面,把刚才复制的XML粘贴到页面最下方的一个输入框里,然后点击"加载OPS"

关于OPS的介绍,可以在版里查看相关资料或者到我的个人网站http://www.cwzb.name查看相关资料.

--------------------------------------------------------------------------------------------------------------------

<PsObject>
 <text1>
  <Type>value</Type>
  <Text>asldfkasdf</Text>
 </text1>
 <text2>
  <Type>value</Type>
  <Text>asdf</Text>
 </text2>
 <hidded>
  <Type>storage</Type>
  <Text>%3Csfsfslfj%3Esfsflsfsf%3Casdfaf%3E</Text>
 </hidded>
 <passwd1>
  <Type>storage</Type>
  <Text>asdf</Text>
 </passwd1>
 <Textarea1>
  <Type>value</Type>
  <Text>         asdfasdf       </Text>
 </Textarea1>
 <text6>
  <Type>check1</Type>
  <Text>1</Text>
 </text6>
 <text7>
  <Type>check1</Type>
  <Text>0</Text>
 </text7>
 <a>
  <Type>mcheck</Type>
  <Text>0,2,</Text>
 </a>
 <asd>
  <Type>radio</Type>
  <Text>3</Text>
 </asd>
 <Select1>
  <Type>select1</Type>
  <Text>0</Text>
 </Select1>
 <select2>
  <Type>mselect</Type>
  <Text>1,2,</Text>
 </select2>
</PsObject>


--  作者:huoniao
--  发布时间:8/16/2006 8:44:00 AM

--  
to upc2neiep:

因为我不知道除了ajax以外,还有其他的方法可以局部更新网页吗?
并且通过读取本地文件来更新网页


--  作者:huoniao
--  发布时间:8/16/2006 9:01:00 AM

--  
to cwzb:

谢谢您的指导。
可能我的问题没有问清楚,并且我刚开始学习web相关的东西。有很多地方我都不明白。

我刚刚接触ajax,ajax可以把存在服务器中的xml文件读取到本地,然后根据需要可以局部更新网页,那如果把xml文件放到本地,怎么局部更新网页呢?

关于您的ops,我又看晕了,不知道怎么使用它,任何一台pc不用进行相关配置就可以使用ops技术吗?不用通过服务器来做相应的服务吗?


--  作者:huoniao
--  发布时间:8/16/2006 12:27:00 PM

--  
我现在有这样一个课题
把一组压缩后的数据放到server中(数据量很大),在任何一台pc上通过IE登录到webserver,从server中取得数据,并且在本地解压缩,然后根据数据内容,局部更新网页。

我的设想是:通过IE登录到webserver后,从服务器上下载并安装activeX插件,该插件由于接收数据、并对其解压缩。
然后使用ajax或者别的技术更新到网页上。

各位有没有更好的建议来实现?

to cwzb:
谢谢您推荐的ops,正在研究中


--  作者:cwzb
--  发布时间:8/17/2006 5:56:00 PM

--  
归根到底,对WEB与浏览器相关的材料还要多看看...

特别是浏览器的处理机制.


--  作者:huoniao
--  发布时间:8/17/2006 6:41:00 PM

--  
晕了,如果用C/S结构来实现的话,应该很好实现,但要用B/S结构,需要学习的东西很多呀

document.getElementById(obj).firstChild.data = data;
这句话是不更新网页的吗?它不是Ajax吗?

另外我从网络中查到
myXmlObj.open ('GET', file, false);是可以读取本地的xml,可为什么执行的效果还是IE打开了指定的xml文件?而不是更新局部网页?

to cwzb:
初步研究您写的代码,说实话,我对JAVASCRIPT不是很熟悉,有一个问题不吝赐教
但我发现您写的JAVASCRIPT单独做成文件,如果通过IE登录到WebServer后,这些文件能下载到本地吗?我不想通过服务器来执行。

对于那个课题,还有哪些好的建议吗?请指教!
最根本问题是解压缩不能放到服务器中运行。
另外,如果要完成课题的话,需要学习那些东西,看些什么书?
谢谢


--  作者:cwzb
--  发布时间:8/19/2006 11:04:00 AM

--  
归根到底,对WEB与浏览器相关的材料还要多看看...

特别是浏览器的处理机制.

///-------------------------------------------------------------------------

就这个了...


--  作者:Qr
--  发布时间:8/19/2006 11:25:00 AM

--  
=================================
document.getElementById(obj).firstChild.data = data;
这句话是不更新网页的吗?它不是Ajax吗?
=================================
如果一定要区分,应该归属AJAH

=================================
另外我从网络中查到
myXmlObj.open ('GET', file, false);是可以读取本地的xml,可为什么执行的效果还是IE打开了指定的xml文件?而不是更新局部网页?
=================================
XMLHttpRequest取XML后,要通过回调函数,将XML根据需要转换输出到局部页面。


--  作者:huoniao
--  发布时间:8/22/2006 9:09:00 AM

--  
to Qr,各位高手:

function AjaxRead(fileName){
    var myXmlObj = null;
    if(window.XMLHttpRequest){
        myXmlObj = new XMLHttpRequest();
    } else if(window.ActiveXObject){
        myXmlObj = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        return;
    }
    myXmlObj.onreadystatechange = function(){
        if(myXmlObj.readyState == 4){
            updateObj('testXmlObj',myXmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data);
        }
    }
    myXmlObj.open ('GET', file, true);
    myXmlObj.send ('');
}
function updateObj(obj, data){
    document.getElementById(obj).firstChild.data = data;
}

myXmlObj.onreadystatechange = function()这句话不是定义了回调函数吗?

附件是我编写的html和xml文件,请指导,谢谢




--  作者:Qr
--  发布时间:8/22/2006 10:01:00 AM

--  
用file://c:/data.xml就出错,改data.xml可以,估计是XMLHttpRequest不能读取本地XML。
--  作者:huoniao
--  发布时间:8/22/2006 10:59:00 AM

--  
我刚才也跟了一下,XMLHttpRequest不能读取本地文件
那么如果必须读取本地文件并局部更新网页,应该怎么办?使用什么技术?
--  作者:YHai
--  发布时间:8/23/2006 4:01:00 PM

--  
以下是引用huoniao在2006-8-11 1:26:00的发言:
我正在学习Ajax,编写一个html
部分代码如下:
... ...
function AjaxRead(fileName){
     var myXmlObj = null;
     if(window.XMLHttpRequest){
         myXmlObj = new XMLHttpRequest();
     } else if(window.ActiveXObject){
         myXmlObj = new ActiveXObject("Microsoft.XMLHTTP");
     } else {
         return;
     }
     myXmlObj.onreadystatechange = function(){
         if(myXmlObj.readyState == 4){
             updateObj('testXmlObj',myXmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data);
         }
     }
     myXmlObj.open ('GET', file, true);
     myXmlObj.send ('');
}
function updateObj(obj, data){
     document.getElementById(obj).firstChild.data = data;
}

... ...

<p id="testXmlObj">
test Ajax<a href="testdata.xml"title="Test Ajax" onclick="AjaxRead('testdata.xml'); this.style.display='none'; return false">
Ajax</a>
</p>
... ...
这样是好用的,可以局部更新网页。
但我想让Ajax或者说让XMLHttpRequest读取本地的xml文件,进行如下改动(黑色部分)
<p id="testXmlObj">
test Ajax<a href="file:///C:/testdata.xml"title="Test Ajax" onclick="AjaxRead('file:///C:/testdata.xml'); this.style.display='none'; return false">
Ajax</a>
无论是把 myXmlObj.open ('GET', file, true);改成 myXmlObj.open ('', file, true);
或者使用ADO Stream读取文件
     ... ...
     //myXmlObj.open ('GET', file, true);
     //myXmlObj.send ('');
     var ado_stream = new ActiveXObject("ADODB.Stream");
     ado_stream.Open();
     ado_stream.LoadFromFile(file);
     xmlObj.responseXML.loadXML( ado_stream.Read(0) );

     myXmlObj.send ('');
执行的效果只是把testdata.xml文件给打开了,而没有达到局部更新网页的效果
请问各位高人,如何解决?
我是刚接触web编程,请各位不吝赐教,谢谢大家了


把testdata.xml文件给打开了,是因为存在这个链接
你把 href="file:///C:/testdata.xml" 改成 href="#"


--  作者:YHai
--  发布时间:8/23/2006 4:04:00 PM

--  
还有 myXmlObj.open ('GET', file, true);  需改成 myXmlObj.open ('GET', fileName, true);
--  作者:huoniao
--  发布时间:8/31/2006 9:24:00 AM

--  
to YHai
不好意思,没有明白您写的内容

把testdata.xml文件给打开了,是因为存在这个链接
你把 href="file:///C:/testdata.xml" 改成 href="#"

您的意思是不是
href="file:///C:/testdata.xml替换成href="#"

还有 myXmlObj.open ('GET', file, true);  需改成 myXmlObj.open ('GET', fileName, true);

您的意思是不是
其中的fileName是不是"file:///C:/testdata.xml"?

请指导


--  作者:vachin
--  发布时间:9/26/2006 9:35:00 AM

--  
貌似xmlhttp对象无法获取本地xml文件,只能获取web上的xml文件

你可以使用xmldom对象,使用load函数来加载本地xml文件


--  作者:zaku
--  发布时间:5/20/2008 5:32:00 PM

--  
这个问题我研究了3天。现在基本上了解了一些,研究成果如下:

1、XMLHttpRequest对象是可以读取本地文件的(以xml文件为主);

2、但XMLHttpRequest对象用.responseXML返回XML DOM时返回状态值为0,能返回XML DOM对象,但其内容为null,即XML DOM不能获取本地XML文件的内容;

3、但用XMLHttpRequest对象的.responseText,能返回正确的字符串形式的内容,既XMLHttpRequest对象可以读取本地文件,但只能返回字符串格式,不能返回有内容的XML DOM对象;

4、在服务器上(包括本地架的,也就是说只要是在服务器环境下)的xml文件,XMLHttpRequest对象无论.responseXML还是.responseText都能正常操作,前者返回XML DOM对象,后者返回字符串;

5、如果一定要操作本地xml文件,可以用XMLHttpRequest对象的.responseText来实现变相的操作;

6、如果一定要操作本地xml文件,并一定要使用XML DOM对象的方法,可以使用XML DOM对象的load函数来加载本地xml文件,具体方法如下:
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("xml.xml");
该方法可以读取本地xml文件生成XML DOM对象;


--  作者:huoniao
--  发布时间:5/20/2008 5:55:00 PM

--  
to zaku,以及关注这个帖子的各位:
这是06年的老帖子了,-_-!
十分感谢关心,并解决这个问题的各位!!!

这个课题是为了对应客户在下载服务器压缩数据后,在本地解压并通过IE实时显示、处理系统而设立的,因为当时没有解决这个问题,就采用其他方法解决了。因此这个课题就取消了。


--  作者:fisherlover
--  发布时间:5/23/2008 4:20:00 PM

--  
不错,看了之后觉得还是很有用,支持支持!
--  作者:ansir127
--  发布时间:8/14/2008 2:06:00 PM

--  请加下我QQ 我要请教一下373252017
373252017
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms