2012-09-04 96 views
0

我使用帶Chorome 21的HTML5 FileAPI來創建,讀取和修改「users.xml」文件,第一次讀取和修改xml代碼時,一切正常,但在第一次之後,閱讀器沒有正確讀取xml,看起來像freader(我的FileReader var object)保留了以前的結果,並搞亂了新的讀取操作。原始的XML:HTML5 FileReader讀取和修改XML問題

<?xml version='1.0' encoding='utf-8'?><users></users> 

我的代碼讀取並添加一個新的子節點:

fs.root.getFile('users.xml', {}, function(fileEntry) {  
    fileEntry.file(function(file) { 
     var freader = new FileReader();    
     freader.onloadend = function(theFile) {      
      console.log("before: " + this.result); 

      var strcontent = this.result; 
      fileEntry.createWriter(function(fileWriter) {      

       var parsed = new DOMParser().parseFromString(strcontent, "text/xml"); 

       var users= parsed.getElementsByTagName("users")[0];            

       var user = parsed.createElement("user"); 
       user.setAttribute('id',txt_rfc.value); 
       var name = parsed.createElement("name"); 
       var textname = parsed.createTextNode(txt_name.value); 
       name .appendChild(textname); 
       user.appendChild(name); 
       users.appendChild(user);                                          

       var serializer = new XMLSerializer(); 
       var str = serializer.serializeToString(parsed); 
            console.log("after: " + str); 
       var bb = new Blob([str],{type:'charset=utf-8'});  
       fileWriter.write(bb);       

      }, errorHandler); 
     }; 
     freader.readAsText(file); 

    }, errorHandler);  
}, errorHandler); 

}

第一次執行讀取並正確寫入這樣的XML:

<?xml version="1.0" encoding="utf-8"?><users><user id="1"><name>John</name></user></users> 

但下一次執行FileReader顯示這樣的讀取結果(這是不正確的,我s錯誤):

<?xml version='1.0' encoding='utf-8'?><users/>ser id="1"><name>John</name></user></users> 

之後,我的代碼無法繼續寫入,因爲xml讀取結果「損壞」。看起來像FileReader需要「清除」或什麼....任何想法?謝謝!!

回答

0

好吧,我發現了問題是什麼異步方式HTML5文件系統API的作品,這是一個有點棘手有時。

我的代碼片段是我真實代碼的簡化版本;我真正的代碼對多個文件進行了多重修改,在某些時候,我連續多次調用原始函數,但由於FileSystem API行爲是異步的,同一個函數的不同實例試圖同時修改同一個文件,這是「搞亂」文件。因此,張貼的代碼段代碼工作正常,我只是添加代碼來檢查以前的修改是否完成再次調用該函數。

0

嘗試一個createTextNode()這樣的,然後嘗試解析XML

var tNode = document.createTextNode(this.result)  
    var parsed = new DOMParser().parseFromString(tNode.nodeValue, "text/xml"); 
+0

thx爲您提供幫助,幾個小時前我想通了。無論如何,我會再次發佈答案,thx :) – gekko