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")
надеюсь, что это помогло