我从使用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");
答案 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")
希望这有帮助