Как читать содержимое файла в Native File System API
Я пытаюсь прочитать содержимое XML-файла. Вероятно, это базовый JS-материал, но я не могу заставить его работать.
Я использую экспериментальный API собственной файловой системы Chrome для чтения папок в папке:
const opts = {type: 'open-directory'};
handle = await window.chooseFileSystemEntries(opts);
const entries = await handle.getEntries();
...
Затем, позже в коде, я ввожу одну из папок из основного каталога и пытаюсь прочитать файл в ней. Структура файловой системы такая:
Directory > subdirectory > file
а вторая часть кода выглядит так:
var subdirHandle = await handle.getDirectory(oneOfTheFolders);
var xmlFile = await subdirHandle.getFile('subject.xml');
xmlDoc = domParser.parseFromString(xmlFile, "text/xml");
parsedNumber = document.evaluate(myXpathFce('nodeInXML'), xmlDoc, null, XPathResult.ANY_TYPE, null).iterateNext();
if(parsedNumber.childNodes.length >0){
...
Я считаю, что проблема здесь var xmlFile = await subdirHandle.getFile('subject.xml');
с чтением файла. Если я загрузил файл прямо из ввода и использовалFileReader()
, Мне удалось получить контент и проанализировать его, но с подходом "каталог" я получаю null (для оцениваемого документа), как это Uncaught (in promise) TypeError: Cannot read property 'childNodes' of null
Изменить вот что я получаю в консоли для переменной xmlFile. Мне просто нужно получить содержимое (XML в текстовом формате) из этого
2 ответа
Я заметил, что вы сохраняете объект File в переменной xmlFile и передаете его непосредственно в метод parseFromString.
Вы не можете напрямую анализировать объект документа из объекта File. Сначала вы должны прочитать строку из объекта File с помощью FileReader. Вы можете прочитать строку из объекта File с ключевым словом await, используя функцию readFileAsync ниже:
function readFileAsync(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.onload = () => {
resolve(reader.result);
};
reader.onerror = reject;
reader.readAsText(file);
})
}
var file = await handle.getFile();
var text = await readFileAsync(file);
var xmlDoc = domParser.parseFromString(text, "text/xml");
Для получения содержимого
FileSystemFileHandle
, вызов
getFile()
, который возвращает
File
объект, который содержит большой двоичный объект. Чтобы получить данные из большого двоичного объекта, вызовите один из его методов (
slice()
,
stream()
,
text()
,
arrayBuffer()
).