开发者社区> 问答> 正文

关于ajax更改xml的问题 - ajax报错

"

大侠们:请求讲解。

描述:我用ajax去更改xml文档的内容,html页面上提示更新成功了,但是在同一个文件夹(wwwroot)下面的xml没有被更改,,,我百度查了下,有人说,更改xml文档,这个xml不能在服务器端里面,需要在客户端,可是我把下面的带面里面xmlhttp.open("GET","book.xml",false);改成我E盘中xml如xmlhttp.open("GET","E:\book.xml",false);结果连找xml的信息都不行了。原来把xml和html同放在wwwroot里还可以搜索xml的信息

问题:能否不用php和asp等,,直接只使用ajax就可以修改xml文档的内容,如果可以,那么这个xml是必须客户端才可以吗? 如果只有客户端可以,那么如果去找这个文件,直接xmlhttp.open("GET","E:\book.xml",false)用了,不可以。。。麻烦大神们解答一下。

javascript中ajax代码如下。

<script>
function k()
{
if(window.XMLHttpRequest)
{
var xmlhttp=new XMLHttpRequest();
}
else
{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}




xmlhttp.open("GET","book.xml",false);
xmlhttp.send();
xmldoc=xmlhttp.responseXML;
var ne=xmldoc.createElement("kog");
var nt=xmldoc.createTextNode("kkkkk");
ne.appendChild(nt);
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(ne);
document.getElementById("div").innerHTML=xmldoc.getElementsByTagName("book")[0].childNodes[1].childNodes[0].nodeValue;

}

</script>
xml代码如下,,


<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">abcde




<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>


<book category="children">abcde


<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>


</book>




</bookstore>

"

展开
收起
montos 2020-06-04 13:22:47 1117 0
1 条回答
写回答
取消 提交回答
  • "首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。######+1,网页不能允许你修改客户本地内容,得到数据然后后台根据这些数据再去读写服务器上的内容######我可以用js操作vba修改我本地的office文档,这是怎么回事######意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 映射可能不准确,应该是理解成副本要好点。######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 这两天脑壳想了很多。个人理解成,每个用户在处理php等的时候是获取其文档里面的一个映射,然后再处理。你说的fclose,我理解成很多用户在一个服务器里面映射了很多php文档,如果不关闭,每个映射在处理过程中都占用一定内存,但是~!~,如果没个用户使用映射的时间不一样,那么对于fclose就可有可无,因为反正用户使用映射完了传送数据给用户了,打开的文档就自动关闭,是把?######回复 <a href=""http://my.oschina.net/kog7"" class=""referer"" target=""_blank"">@kog-7 : 而unset,不一定是用来销毁数组的。 也可以用来销毁数组元素的。比如unset( $arr['a'] ); 这样就是纯粹的数组函数了。 关于PHP事件,不知道可不可以这样称呼, PHP只有一种事件,就是请求事件,就是说只有客户端请求它才会响应并执行。 当然如果你在服务器设置了计划任务那就另当别论了。 以上都是我的个人观点。经验之谈。 不一定正确。######回复 <a href=""http://my.oschina.net/kog7"" class=""referer"" target=""_blank"">@kog-7 : fclose你可能现在看不出作用。 但是大项目的时候,资源优化要做的很全面的。 一个用户读一个文件是1M,1000个用户同时读就是1G,并且占用1000个I/O资源,用完就手动fclose,而不是等到程序结束,这样就能在同一时刻减少I/O占用率( 有时你看到fclose靠近文件末尾,但那里有时并不代表程序结束。特别是面向对象程序设计 )。######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 就是点击,或者某个状态生成了激活某处功能。######<div class=""ref"">

    引用来自“kog-7”的答案

    我可以用js操作vba修改我本地的office文档,这是怎么回事

    百度了一下 :

    Visual Basic for Applications(VBA)是Visual Basic的一种语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。

    关键是你能修改别的文档吗?

    ######

    引用来自“kog-7”的答案

    意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?
     。。呃,关键不在于内存的占用。 而在于I/O的占用。 内存很便宜,但是I/O资源有限,你要知道像百度谷歌这样的大网站,每秒钟都会有几千上万的用户在同时操作。而且一个请求不是一秒就可以完成的。 虽说现在有什么负载均衡的技术,不过算下来,每时段的用户请求也不是小数目 。fclose要养成习惯。数据库也是一样。 遇到大项目就不易出问题。 你说的映射,或者副本,应该可以理解成C语言里的指针。 你可以想象一下,如果某个用户上传了一个100G的文件,如果要删除这个文件,是不是要把它载入内存? 我想不可能吧。  读取也是一样, 通过指针去读取数据流而已。 而不用把整个文件放入内存。 并且单个用户的内存占用是有限制的。所以fclose是省I/O。
    ######如果没经过内存的,再要引用他,就要指定相关已被传输的文档,然后找起!!!是不? (限制字数,我分开回答)######同时我理解的js和html也如此,也是向文档请求,然后文档把其代码复制张贴到内存。。。这样子我觉得要容易理解一些,也很容易解释为什么你操作的js是不会反应到本来的js文档中的。。。。同时对于跨内容的传递,比如你说的100g的文档,我理解的是,让这个100g移动的命令是在内存中的,但是命令只是要求其从a文档移动到b文档,不经过内存。。。同时,如果有那种要经过内存的数据,就可以直接引用其值######我说的副本,理解是,比如服务器上有个PHP文档,我在浏览器请求这个php,那么这个php就把其代码复制张贴到内存中运行(所以这个副本跟前面的php就没有关系了),然后内存的代码运行得出一些数据。。######呵呵,不知道I/O是什么东西,都是自学的,这些没看到,读书的时候工科,所以c什么指针的不重要都在睡觉。######

     所谓I/O就是输入输出。通俗说,就是硬盘的数据通道。你fopen一次,就占用一个通道(直到程序执行结束或fclose)。硬盘的I/O发展远没有容量发展的快。 所以硬盘容量可以十几个TB但是I/O还是差不多。 

    你说的副本这个原理,我也说不清楚,我也是自学的。 C语言也只是了解了一下而已。

    不论PHP JS HTML都是载入内存来执行的。 但是会不会一个用户载入一个PHP我就不敢肯定了。 不过有一点可以肯定, 你在服务器修改程序,新的请求会得到新的程序执行的结果 。 而不需要重启PHP服务,这应该能证明你说的副本吧。

    然后html不算编程语言,是标记语言,你不能说一个html文件是一个程序吧,程序的结果是可变的,纯html 是固定的。js不能操作文档不是因为它被载入内存。 PHP也被载入内存的,任何程序都要载入内存去执行。 关键在于js寄存的浏览器,没有给js操作权限。 js被包裹起来了。 只能通过浏览器去操作cookie之类的有严格限定的文件。 而php的解释器是拥有文件操作权限的。 当然只是有服务器的文件操作权限。 客户端的东西是不能操作的。 至少光凭它自己是不能的。 同样的,js也是不能操作服务器上的东西的。 就算是读取服务器的文件,也是要经过apache之类 的服务器软件来读取的。 js本身只是给服务器发个话。 服务器给不给返回,还是看服务器心情的。

    很多东西个人理解会有偏差,我建议你有不理解的地方就查查文档。 比我这种业余的码农更权威。

    ######还有就是不管i/O和内存,都是开始说的一个用户占用部分的东西,如果多个用户不是同时解析,那么,,就可以说成是fclose这个可以不写,当然写了最好######额,问下,你什么行业啊,以前学什么专业。。? 专业的书籍我看了一些,但是一两本书说的很少,同时国内的书确实不好,国外的书翻译的又老火。######

    我就是一个业余的爱好者而已。没学过什么专业,也不在什么行业。 纯兴趣。 当然以后就难说了。

    老实说,我是最近一年才学的编程。 但是计算基础方面的东西积累了很多年,也有一定的了解了。 你叫我买书来看我真看不下去。 我的方法是,先看视频。 对一门语言有大概了解,然后把文档上的每一条都拿 来琢磨透,然后开发小项目。 当然我也没能吞下文档。 所以才成为业余的。

    另外上面这个问题 如果多个用户不是同时请求或者用户很少,自然不需要fclose了。 不过也有可能程序结束没有关闭I/O连接导致进程关闭失败造成僵尸进程, 浪费了资源。也难说的。

    ######呵呵,你让我想起了有,不要问我从哪里来,我不也不知道去哪里,我不属于任何地方,未来一切皆有可能的某部电影~~~~###### @kog-7 这是褒奖吗。。。。 ######回复 @Infinity : 改xml的php,写在上面,感觉用了很多重复的话######回复 @業餘碼農 : 那好多人都去提鞋了~我只是好奇好奇,你要是提鞋的,我就是给别人檫菊花的~!~######。。。。要是有个人对自己的身份工作支支吾吾遮遮掩掩,要么他是个特工黑客要么他就是个提鞋的。你觉得我像不像特工呢?######回复 @業餘碼農 : 呵呵,搞那么多标签干嘛嘛,你就是你,我只想了解你是干嘛的。######回复 @kog-7 : 。。。。。。。。。。。。农二代工一代码后代。######就是这个改xml,感觉写多了<?php
    header("Content-type: text/html; charset=utf-8");
    print '<style>
    body{
    background:rgba(223,238,231,0.9);
    }
    .error{color:rgb(182,69,69);font-size:60%;}
    .iput
    {
    border:1px solid black;     
    height:10%;
    background:rgb(223,238,231);
    font-family:"Microsoft YaHei",微软雅黑,helvetica;
    }
    #word0u
    {
    margin-left:2%;
    float:left;
    margin-top:5%;
    font-family:"Microsoft YaHei",微软雅黑,helvetica;
    }
    #input0u
    {
    list-style-type:none;
    float:left;
    margin-top:5%;
    }
    </style>';
    print
    "<script>
    function closef()
    {window.parent.document.getElementById('screen').style.display='none';}
    </script>";




    print '<body><button  style="cursor:pointer;border:1px;right:0px;top:0px;font-family:arial;font-weight:bolder;position:absolute" onclick="closef()">X</button>  ';
    $pro=true;
    if($_SERVER['REQUEST_METHOD']=="POST")
    {
    $pro=false;
       if(empty($_POST['user'])||empty($_POST['pw'])||empty($_POST['pw2']))
       {$pro=true;
       print '<span class="error">'.iconv('gb2312','utf-8','请输入用户名和密码').' </span>';}
       if(strlen($_POST['user'])>15)
       {$pro=true;
       print '<span class="error">'.iconv('gb2312','utf-8','用户名要小于5位数').' </span>';}
       if(strlen($_POST['pw'])<5)
       {$pro=true;
       print '<span class="error">'.iconv('gb2312','utf-8','密码要大于5位数').' </span>';}
       if(empty($_POST['pw'])!=empty($_POST['pw2']))
       {$pro=true;
       print '<span class="error">'.iconv('gb2312','utf-8','两次密码输入不一样').' </span>';}
     $xmluser=new DOMDocument;
     $xmluser->load('euser.xml');
     $users=$xmluser->getElementsByTagName('user');
    for($i=0;$i<$users->length;$i++)
    {


    if($users->item($i)->childNodes->item(0)->nodeValue==$_POST['user'])
    {
    $pro=true;
    print '<p class="error">'.iconv('gb2312','utf-8','有人用了这个用户名').'</p>';;
    break;
    }
    }
    }
    if(!$pro)
    {
    date_default_timezone_set('Asia/Shanghai');
     $log= $xmluser->createElement('log');
     $user= $xmluser->createElement('user');
     $pw= $xmluser->createElement('pw');
     $time=$xmluser->createElement('time');
    $usert=$xmluser->createTextNode($_POST['user']);
    $pwt=$xmluser->createTextNode($_POST['pw']);
    $da=date("Y-m-d");
    $timet=$xmluser->createTextNode($da);
    $user->appendChild($usert);
    $pw->appendChild($pwt);
    $time->appendChild($timet);
    $log->appendChild($user);
    $log->appendChild($pw);
    $log->appendChild($time);
    $xmluser->documentElement->appendChild($log);
    $xmluser->save('euser.xml');
    print "<h2 style='font-family:微软雅黑,helvetica'>".iconv('gb2312','utf-8','欢迎').$_POST['user']." ".$da." ".iconv('gb2312','utf-8','您已注册')."</h2>";
    $uu=$_POST['user'];
    $pp=$_POST['pw'];
    print "<script>
    window.parent.document.getElementById('user').innerHTML='hello<br>$uu';
    window.parent.document.getElementById('login').style.display='none';
    window.parent.document.getElementById('logon').style.display='none';
    window.parent.document.getElementById('cookss').style.display='none';
    window.parent.document.getElementById('clears').style.display='inherit';
    window.parent.document.getElementById('chat').src='example1.html';
    document.cookie='koguser=$uu';
    </script></body>";


    }
    else
    { print "<p style='font-family:arial;font-weight:bold;font-size:150%;letter-spacing:5px;margin-left:auto;margin-right:auto;width:70%;height:10%;text-align:center;margin-top:2%'>welcome</p>";
    $_POST=array();
    print 
    "<form action='elog.php' method='post'><ul id='word0u'><li>".iconv('gb2312','utf-8','用户名')."</li><br><li>"
    .iconv('gb2312','utf-8','密码')."</li><br><li>"
    .iconv('gb2312','utf-8','再次确认密码')."</li></ul>
    <ul id='input0u'><li><input class='iput' type='text' name='user' size='20'/></li><br>
    <li><input class='iput' type='password' name='pw' size='20'/></li><br>
    <li><input class='iput' type='password' name='pw2' size='20'/></li></ul><div><input style='border:2px solid black;clear:left;font-family:helvetica;background:rgb(223,238,231);margin-left:42%;margin-top:3%;font-size:18px;width:100px;text-align:center' type='submit' value=".iconv('gb2312','utf-8','注册')."></div></form></body>";
    }
    ?>

    ######

    引用来自“Infinity”的评论

    首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。

    谢谢~

    "
    2020-06-04 13:24:13
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
WEB浏览器中即将发生的安全变化 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载