#c# #google-drive-api #asp.net-core-2.0
#c# #google-drive-api #asp.net-core-2.0
Вопрос:
Я работаю в .Net Core 2 и использую API Google Drive v3 и извлекаю XML-файл. Я получаю обратно MemoryStream, но не могу прочитать MemoryStream в XmlDocument. Я попробовал пару файлов, и размер потока памяти соответствует размеру файла, поэтому я уверен, что я действительно получаю данные. Как мне превратить этот MemoryStream в XML-документ? Или строку, которую я могу разобрать в XML?
Я попытался загрузить поток в XML-документ и средство чтения текста. Программа чтения текста возвращается с пустой строкой, а загрузчик xml сообщает, что родительский узел не найден.
//Fetch the file from Google Drive
var request = _driveService.Files.Get(fileId);
var stream = new System.IO.MemoryStream();
request.Download(stream);
//How I Try and parse to string
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
//How I try to load to xml
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(stream);
Комментарии:
1. Вы пробовали перематывать
MemoryStream
перед вызовомReadToEnd
?2. Вот и все! Вы должны полностью представить это в качестве ответа, чтобы я мог пометить это как нечто удивительное!
Ответ №1:
XmlDocument
Похоже, что то, что вы получаете обратно, может быть недействительным XML без небольшого изменения, поэтому вам следует начать с реализации на MemoryStream
основе, чтобы увидеть, что вы получаете от сервиса.
Чтобы это заработало, вам нужно «перемотать» поток. Потоки имеют понятие «текущая позиция», например, курсор, и такие методы, как Download
традиционно, оставляют курсор в конце данных после загрузки их в поток. Иногда это не имеет значения, например, когда вы используете a FileStream
для записи данных непосредственно в файл, но если вы загружаете данные в a MemoryStream
, а затем хотите немедленно их прочитать, вам нужно сначала вернуть курсор обратно в начало потока с stream.Seek(0, SeekOrigin.Begin)
помощью .