StreamReader и чтение XML-файла

Я получаю ответ от веб-сервера с помощью StreamReader... теперь я хочу проанализировать этот ответ (это файл XML-документа), чтобы получить его значения, но каждый раз, когда я пытаюсь это сделать, я получаю ошибку: корневой элемент отсутствует.

Если я читаю тот же XML-файл напрямую, файл хорошо отформатирован, и я могу его прочитать.

это поток:

WebResponse response = webRequest.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream);
string responseString = responseReader.ReadToEnd();

и вот как я пытаюсь прочитать XML-файл:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(responseReader);
XmlNodeList address = xmlDoc.GetElementsByTagName("original");

5 ответов


Вы назвали ReadToEnd(), следовательно, потреблял все данные (в строку). Это означает, что читателю больше нечего дать. Просто: не делай этого. Или сделайте это и используйте LoadXml(reaponseString).


на загрузить метод способен извлекать XML-документы из удаленных ресурсов. Таким образом, вы можете упростить свой код следующим образом:

var xmlDoc = new XmlDocument();
xmlDoc.Load("http://example.com/foo.xml");
var address = xmlDoc.GetElementsByTagName("original");

нет необходимости в каких-либо WebRequests, WebResponses, StreamReaders,... (который, кстати, вы не правильно распорядились). Если это не работает, это, вероятно, потому, что удаленный XML-документ не является реальным XML-документом, и он сломан.


Если вы делаете это с точным кодом, который вы вставили в свой вопрос, то проблема в том, что вы сначала читаете весь поток в строку, а затем пытаетесь прочитать поток снова при вызове xmlDoc.Load(responseReader)

Если вы уже прочитали весь поток в строку, используйте эту строку для создания xml-документа xmlDoc.Load(responseString)


проверьте содержимое responseString: возможно, он содержит некоторые дополнительные заголовки, которые делают xmlparser несчастным.


ошибка вы получаете означает, что XML, вы получите не первый элемент, который обертывает весь контент. Попробуйте обернуть полученный ответ каким-либо элементом, например:

   WebResponse response = webRequest.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream);
string responseString = responseReader.ReadToEnd();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXML( "<root>" + responseString + "</root>" );
XmlNodeList address = xmlDoc.GetElementsByTagName("original")

надеюсь, что это помогло