2012-09-04 58 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