【问题标题】:StreamReader and reading an XML fileStreamReader 和读取 XML 文件
【发布时间】:2011-01-30 09:00:14
【问题描述】:

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

【问题讨论】:

  • 使用 Console.Write(responseReader);我得到了完美格式化的 xml 文件,我已经复制粘贴到一个文件并尝试用我的代码手动读取它,它可以工作。
  • 另外——你应该在大多数这些对象上使用using。您可能会发现 WebClient 比 web-request/response 更容易 - 或者,如其中一个答案所述,只需 Load(path) 让文档担心它

标签: c# .net xml streamreader


【解决方案1】:

您调用了ReadToEnd(),因此消耗了所有数据(到一个字符串中)。这意味着读者没有什么可以提供的了。只是:不要那样做。或者,这样做并使用LoadXml(reaponseString)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • OP 说他会得到“缺少根元素”意味着没有根元素作为响应,因此应该将其放在根元素中或者应该修复他的响应,您当前的代码不会对目前的方式。
    • @Saeed,不,如果您没有正确使用流读取器,它将返回一个空字符串并且 XmlDocument 会抱怨。 OP 首先在流读取器上调用ReadToEnd,然后将同一个读取器传递给Load 方法,但由于读取器已经定位在末尾,它没有返回任何内容。我的代码修复了它,因为我的代码所做的只是依赖于框架中已经内置的内容。当然,正如我提到的,如果远程 XML 损坏,则需要先修复它。
    • 是的,首先我认为 OP 在不同的代码中尝试它们:) 现在接受答案后我看到了他的错误。
    【解决方案3】:

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

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

    【讨论】:

    • 第二种用法应该是 LoadXml,因为 Load(string) 需要一个 path,而不是 xml
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      希望这有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 2014-03-25
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多