C# StreamReader和读取XML文件

C# StreamReader和读取XML文件,c#,.net,xml,streamreader,C#,.net,Xml,Streamreader,我使用StreamReader从web服务器获得响应。。。现在我想解析这个响应(它是一个XML文档文件)以获取它的值,但每次我尝试这样做时都会得到一个错误:根元素丢失 如果我直接读取同一个XML文件,则该文件格式良好,我可以读取它 这是一条流: WebResponse response = webRequest.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader responseRea

我使用StreamReader从web服务器获得响应。。。现在我想解析这个响应(它是一个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");

检查responseString的内容:它可能包含一些使xmlparser不满意的附加头

您调用了
ReadToEnd()
,因此消耗了所有数据(转换为字符串)。这意味着读者没有更多的东西可以给予。只是:不要那样做。或者,这样做并使用
LoadXml(reaponseString)

如果使用粘贴在问题中的确切代码,那么问题是您首先将整个流读取为字符串,然后在调用时再次尝试读取流

加载(响应阅读器)

如果已经将整个流读取到字符串中,请使用该字符串创建xml文档

加载(responseString)

该方法能够从远程资源获取XML文档。因此,您可以像这样简化代码:

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

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

您得到的错误意味着,您收到的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")
WebResponse-response=webRequest.GetResponse();
Stream responseStream=response.GetResponseStream();
StreamReader responseReader=新的StreamReader(responseStream);
字符串responseString=responseReader.ReadToEnd();
XmlDocument xmlDoc=新的XmlDocument();
LoadXML(“+responseString+”);
XmlNodeList地址=xmlDoc.GetElementsByTagName(“原始”)

希望这对Console有所帮助;我得到了格式完全正确的xml文件,我将副本粘贴到一个文件中,并尝试用我的代码手动读取它。同样,它也可以工作。而且-您应该在大多数对象上使用
使用
。您可能会发现
WebClient
比web请求/响应更容易,或者,正如其中一个答案中所指出的,让文档只使用
Load(path)
第二种用法应该是LoadXml,因为Load(string)需要路径,而不是xmlOP说他将得到“根元素丢失”表示响应中没有根元素,因此应将其放入根元素中或修复其响应,您当前的代码不会对当前方式进行任何更改。@Saeed,否,如果您没有正确使用streamreader,它将返回一个空字符串,XmlDocument将投诉。OP首先在流读取器上调用
ReadToEnd
,然后将同一读取器传递给
Load
方法,但由于读取器已位于末尾,因此它没有返回任何内容。我的代码修复了它,因为我的代码所做的一切都依赖于框架中已经构建的内容。当然,正如我提到的,如果远程XML被破坏,那么首先需要修复它。是的,首先我认为OP用不同的代码尝试它们:)现在在接受了答案之后,我看到了他的错误。