我目前正在将一个WinJS JavaScript / Typescript Windows 10 Universal应用程序移植到Apache Cordova。在Windows 10 WinJS应用程序中,通过以下方式加载本地XML文件效果非常好:
private loadXmlAsync(version: Version): WinJS.Promise<Windows.Data.Xml.Dom.XmlDocument> {
return new WinJS.Promise((complete, error, progress) => {
Utility.getVerifiedUriAsync(version.fileName).then((uri) => {
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then((file) => {
Windows.Data.Xml.Dom.XmlDocument.loadFromFileAsync(file).then((doc) => {
complete(doc);
});
});
});
});
}
在加载本地XML文件时提供Windows.Data.Xml.Dom.XmlDocument对象。
现在将此功能移植到Apache Cordova,我已经使以下解决方案工作:
function loadXmlAsync(fileName: string): WinJS.Promise<Document> {
return new WinJS.Promise((complete, error, progress) => {
getVerifiedUriAsync(fileName).done((uri) => {
(window as any).resolveLocalFileSystemURL(uri,
(f: FileEntry) => {
f.file((file) => {
var reader = new FileReader();
reader.onloadend = (evt) => {
var parsedXml = new DOMParser().parseFromString((evt.target as any).result, "text/xml");
complete(parsedXml);
}
reader.onerror = (evt) => {
error(evt.target);
}
reader.readAsBinaryString(file);
});
},
(e) => {
error(e);
}
);
});
});
}
然而,这个解决方案非常慢,特别是与几乎即时的WinJS / Windows 10应用程序的解决方案相比。
时间的流失发生在极慢reader.readAsBinaryString(file)
的呼叫中。 (DOMParser().parseFromString()
运行良好且速度相对较快)(我也试过reader.readAsText(file)
,速度也很慢)
因此,是否有一种正确的方法在Apache Cordova中以与Windows 10 / WinJS实现类似的方式加载本地XML文件?
谢谢!