如何使用ajax和javascript保存xml文件

如何使用ajax和javascript保存xml文件,javascript,ajax,xml,Javascript,Ajax,Xml,我正在尝试向xml文件添加一个元素。我已经用调试器检查了这个程序,我看到它确实将元素添加到了xml文件中,但是当我停止运行时,该文件没有保存任何更改。 以下是javascript文件: var xmlhttp = LoadXMLHttp(); var xmlDoc=LoadXMLDoc("XMLFile.xml");; function LoadXMLHttp() { var xmlHttp; if (window.XMLHttpRequest) xmlHttp

我正在尝试向xml文件添加一个元素。我已经用调试器检查了这个程序,我看到它确实将元素添加到了xml文件中,但是当我停止运行时,该文件没有保存任何更改。 以下是javascript文件:

var xmlhttp = LoadXMLHttp();
var xmlDoc=LoadXMLDoc("XMLFile.xml");;
function LoadXMLHttp() {
    var xmlHttp;
    if (window.XMLHttpRequest)
        xmlHttp = new XMLHttpRequest();
    else
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    return xmlHttp;
}
function LoadXMLDoc(FileName) {
    xmlhttp.open("GET", FileName, false);
    xmlhttp.send(null);
    return xmlhttp.responseXML;
}
function CreateXmlElement() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        newMessageElement = xmlDoc.createElement("message");
        newTextElement = xmlDoc.createElement("text");
        newText = xmlDoc.createTextNode("I am fine");
        newTextElement.appendChild(newText);
        newMessageElement.appendChild(newTextElement);
        x = xmlDoc.documentElement;
        x.appendChild(newMessageElement);
    }
}
function AddXMLElement() {
    xmlhttp.open("POST", "Default.aspx", true);
    xmlhttp.setRequestHeader("Accept", "text/xml");
    xmlhttp.onreadystatechange = CreateXmlElement;
    xmlhttp.send(xmlDoc);
}
下面是xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<conversation>
  <message>
    <text>Hi</text>
  </message>
  <message>
    <text>How are you?</text>
  </message>
</conversation>

你好
你好吗?
顺便说一下:

  • 我不知道jquery或
    php
    ,但我知道
    asp.net

  • 如果我将打开的url更改为“XMLFile.xml”,我会收到一条错误消息,上面写着“methodnotallowed”

  • 我有一个按钮可以激活
    AddXMLElement()
    函数


  • 您正在执行
    CreateXmlElement
    方法作为对AJAX帖子的回调。因此,您可以在将文档发送到服务器之后而不是之前修改文档。这就是为什么不保存修改后的文档

    您可能希望执行以下操作:

    function CreateXmlElement() {
        newMassageElement = xmlDoc.createElement("massage");
        newTextElement = xmlDoc.createElement("text");
        newText = xmlDoc.createTextNode("I am fine");
        newTextElement.appendChild(newText);
        newMassageElement.appendChild(newTextElement);
        x = xmlDoc.documentElement;
        x.appendChild(newMassageElement);
    }
    function AddXMLElement() {
        CreateXmlElement();
    
        xmlhttp.open("POST", "Default.aspx", true);
        xmlhttp.setRequestHeader("Accept", "text/xml");
        xmlhttp.send(xmlDoc);
    }
    

    这个结构适合我。它打开一个xml文件,更改一个标记并将其保存回服务器。。 HTML部分:

    <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="utf-8">
          <title>xml </title>
        </head>
        <body>
        <div id="xml_tag0" >
          zero  
        </div>  
        <div id="xml_tag" >
          Start!!  
        </div>
        <div id="xml_tag2" >
          Start!!  
        </div>
        </body>
        <script type="text/javascript" src="./js/jquery.min.js"></script>
        <script type="text/javascript" src="./js/test_xml_load_and_save.js" charset="utf-8"></script>
      </html>
    
    
    xml
    0
    开始
    开始
    
    JavaScript部分(test_xml_load_和_save.js):

    $.ajax({
    键入:“GET”,
    url:“../php/B.xml”,
    数据类型:“文本”,
    成功:函数(xml){
    doc=$.parseXML(xml)
    $('#xml_标记').text($(doc.find('row FIELD2').eq(2.text());
    console.log($(doc.find('row FIELD2')).eq(2.text());
    $(doc.find('row FIELD2').eq(2).text('50%);
    xml=(新的XMLSerializer()).serializeToString(doc);
    //var数据字符串=“”;
    var-dataString=xml;
    $('#xml_tag0')。文本(xml);
    $.ajax({
    键入:“POST”,
    url:“../php/ToXML.php”,
    contentType:“text/xml”,
    数据类型:'text',
    数据:{xml:dataString},
    cache:false,
    成功:功能(响应){
    控制台日志(响应);
    $('#xml_tag2')。文本(响应);
    },
    成功:功能(数据){
    console.log('log success:'+数据);
    $('#xml_tag2').text('日志成功:'+数据);
    } 
    });
    }});
    
    PHP部分(PHP/ToXML.PHP):

    
    
    XML文件:

     <?xml version="1.0" encoding="UTF8"?>
    
      <root>
      <row>
      <FIELD1>Cat1</FIELD1>
      <FIELD2>Min</FIELD2>
      <FIELD3>Neutral</FIELD3>
      <FIELD4>Max</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>Liquid</FIELD1>
      <FIELD2>0%</FIELD2>
      <FIELD3>7%</FIELD3>
      <FIELD4>65%</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>Bonds</FIELD1>
      <FIELD2>25%</FIELD2>
      <FIELD3>50%</FIELD3>
      <FIELD4>70%</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>Equities</FIELD1>
      <FIELD2>10%</FIELD2>
      <FIELD3>25%</FIELD3>
      <FIELD4>35%</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>AltInv</FIELD1>
      <FIELD2>0%</FIELD2>
      <FIELD3>18%</FIELD3>
      <FIELD4>30%</FIELD4>
      </row>
    
      </root>
    
    
    第一类
    分钟
    中立的
    马克斯
    液体
    0%
    7%
    65%
    债券
    25%
    50%
    70%
    股票
    10%
    25%
    35%
    阿尔廷夫
    0%
    18%
    30%
    
    您必须支持哪些浏览器?上面的整个内容非常粗糙,对于支持IE6和IE5.5之类的浏览器非常有用,我怀疑您是否真的需要支持这些浏览器。请澄清这一点。我不确定我是否理解正确。您是指xmlhttp.onreadystatechange=CreateXmlElement;应该在“开放”之前写吗?@Xshibi我已经更新了我的答案,但我不得不承认,有点不清楚你想做什么。据我所知:1)从服务器获取文件,2)修改XML,3)将修改后的XML发回服务器。谢谢您的回答,但它仍然不起作用。我基本上是在尝试为我的学校项目创建一个聊天系统。问题在于,当用户(me)尝试向另一个用户发送消息时,该消息不会添加到包含对话的xml文件中。所以我创建了一个小项目来解决这个问题。@Xshibi您是否要在服务器端再次保存发布的XML文件?该保存功能在javascript中不起作用,我认为发布会保存文件。你知道我该怎么解决吗?
          <?php
          header('Content-Type: text/html; charset=UTF-8');
    
    
          $data = $_POST['xml'];
          $xml = file_get_contents('php://input');
          $xml = rawurldecode($xml);
          $xml = str_replace('+', '', $xml);
          $xml = str_replace('xml=', '', $xml);
          //echo ":".$xml;
          $xml = '<?xml version="1.0" encoding="UTF-8"?>' . $xml;
    
          $filename = "B.xml";
          $f = fopen($filename, 'w+');
          fwrite($f, $xml);
          fclose($f);
          echo "Ok";
          ?>
    
     <?xml version="1.0" encoding="UTF8"?>
    
      <root>
      <row>
      <FIELD1>Cat1</FIELD1>
      <FIELD2>Min</FIELD2>
      <FIELD3>Neutral</FIELD3>
      <FIELD4>Max</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>Liquid</FIELD1>
      <FIELD2>0%</FIELD2>
      <FIELD3>7%</FIELD3>
      <FIELD4>65%</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>Bonds</FIELD1>
      <FIELD2>25%</FIELD2>
      <FIELD3>50%</FIELD3>
      <FIELD4>70%</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>Equities</FIELD1>
      <FIELD2>10%</FIELD2>
      <FIELD3>25%</FIELD3>
      <FIELD4>35%</FIELD4>
      </row>
    
    
      <row>
      <FIELD1>AltInv</FIELD1>
      <FIELD2>0%</FIELD2>
      <FIELD3>18%</FIELD3>
      <FIELD4>30%</FIELD4>
      </row>
    
      </root>