2014-12-21 64 views
1

我想將一個元素添加到xml文件中。我用調試器檢查了程序,我看到它真的把元素添加到xml文件中,但是當我停止運行時,文件沒有保存任何更改。 這裏是JavaScript文件:如何用ajax和javascript保存xml文件

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> 

順便說一句:

  1. 我不知道的jQuery或php但我知道asp.net

  2. 如果我改變打開URL到「XMLFile.xml」,我得到一個錯誤消息,說「方法不允許」。

  3. 我有一個按鈕來激活AddXMLElement()函數。

+0

你必須支持哪些瀏覽器?上面的東西真的很重要,對於支持IE6和IE5.5等瀏覽器非常有用,我懷疑你實際上不得不支持這些瀏覽器。請澄清一下。 –

回答

1

您正在執行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); 
} 
+0

我不知道我是否正確地解決了你的問題。你的意思是xmlhttp.onreadystatechange = CreateXmlElement;應該寫在「開放」之前? – Xshibi

+0

@Xshibi我已經更新了我的答案,但是我不得不承認,你試圖做的事情有點不清楚。據我所知:1)從服務器獲取文件,2)修改XML,3)將修改的XML發佈回服務器。 –

+0

謝謝你的回答,但它仍然無法正常工作。我基本上正在爲我的學校項目創建一個聊天系統。問題是,當用戶(我)試圖向其他用戶發送消息時,消息不會添加到包含該對話的xml文件。所以我創建了一個小型項目來解決這個問題。 – Xshibi

0

這種結構爲我工作。它打開一個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> 

JavaScript部分(test_xml_load_and_save.js):

 $.ajax({ 
     type: 'GET', 
     url: '../php/B.xml', 
     dataType: 'text', 
     success: function(xml){ 

      doc = $.parseXML(xml) 
      $('#xml_tag').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 = (new XMLSerializer()).serializeToString(doc); 

      //var dataString = '<test></test>'; 
      var dataString = xml; 
      $('#xml_tag0').text(xml); 

      $.ajax({ 
      type: 'POST', 
      url: '../php/ToXML.php',   
      contentType: "text/xml", 
      dataType:'text', 
      data: {xml : dataString}, 
      cache: false, 
      success: function(response) { 
       console.log(response); 
       $('#xml_tag2').text(response); 
      }, 
      success: function(data){ 
       console.log('LOG success: '+data); 
       $('#xml_tag2').text('LOG success: '+data); 
      } 
      }); 



     }}); 

和PHP的一部分( PHP/ToXML.php):

 <?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文件:

<?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>