StreamReader并读取XML文件

时间:2011-01-30 09:00:15

标签: c# .net xml streamreader

我从使用StreamReader的Web服务器获得响应...现在我想解析这个响应(它是一个XML文档文件)来获取它的值,但每次我尝试这样做时都会出错:Root元素缺失。

如果我直接读取相同的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 个答案:

答案 0 :(得分:17)

您已调用ReadToEnd(),因此消耗了所有数据(转换为字符串)。这意味着读者无需再给予。只是:不要这样做。或者,这样做并使用LoadXml(reaponseString)

答案 1 :(得分:6)

Load方法能够从远程资源中获取XML文档。所以你可以像这样简化你的代码:

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

不需要任何WebRequests,WebResponses,StreamReaders,......(顺便说一句,你没有妥善处理)。如果这不起作用,可能是因为远程XML文档不是真正的XML文档而且它已被破坏。

答案 2 :(得分:2)

如果您使用在问题中粘贴的确切代码来执行此操作,那么问题是您首先将整个流读入字符串,然后在调用时再次尝试读取流 xmlDoc.Load(responseReader)

如果您已经将整个流读取到字符串,请使用该字符串创建xml文档 xmlDoc.Load(responseString)

答案 3 :(得分:0)

检查responseString的内容:可能它包含一些使xmlparser不满意的额外标头。

答案 4 :(得分:-1)

您获得的错误意味着您收到的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")

希望这有帮助