0

私はChorome21でHTML5FileAPIを使用して、「users.xml」ファイルを作成、読み取り、変更しています。コードが最初にxmlを読み取って変更したときはすべて正常に機能しますが、初めての場合、リーダーは読み取りません。 xmlは適切に、freader(私のFileReader varオブジェクト)が前の結果を保持し、新しい読み取り操作を台無しにしているようです。元の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は、次のような読み取り結果を示しています(これは正しくなく、間違っています)。

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

その後、xmlの読み取り結果が「破損」しているため、コードの書き込みを続行できません。FileReaderを「クリア」する必要があるようです...何かアイデアはありますか?どうも!!

4

2 に答える 2

0

わかりました。問題は、HTML5 FileSystem APIが機能する非同期の方法であることがわかりました。これは、少し注意が必要な場合があります。

私のコードスニペットは、実際のコードを簡略化したものです。私の実際のコードは複数のファイルに複数の変更を加えます。ある時点で元の関数を連続して数回呼び出していましたが、FileSystem APIの動作は非同期であるため、同じ関数の異なるインスタンスが同時に同じファイルを変更しようとしました。 、そしてこれはファイルを「めちゃくちゃ」にしていた。投稿されたスニペットコードは正常に機能するため、関数を再度呼び出す前に、前の変更が完了したかどうかを確認するコードを追加しました。

于 2012-09-05T18:28:34.113 に答える
0

このようにcreateTextNode()を試してから、XMLを解析してみてください

   var tNode = document.createTextNode(this.result)    
   var parsed = new DOMParser().parseFromString(tNode.nodeValue, "text/xml");   
于 2012-09-04T10:45:46.277 に答える