Как читать содержимое файла в 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()).

Другие вопросы по тегам