XmlReader.Read()如何工作?

时间:2013-11-22 19:53:16

标签: c# .net stream xmlreader

我从外部API获取大量XML数据。

最初我使用过这样的东西:

string uri = "http://wwww.sometld.com/api";
XDocument xmlDoc = new XDocument();

HttpWebRequest client = (HttpWebRequest)WebRequest.Create(uri);
client.Timeout = 2100000;//35 minutes
WebResponse apiResponse = client.GetResponse();

Stream receivedStream = apiResponse.GetResponseStream();
StreamReader reader = new StreamReader(receivedStream);

string s = reader.ReadToEnd();

我遇到了问题,因为有时XML文档太大而我遇到了“内存不足”异常(2-3GB文件!)。

所以我改变了我的过程来改为使用类似的东西:

string uri = "http://wwww.sometld.com/api";
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;

string xmldocstring = "";

using (XmlReader reader = XmlReader.Create(uri, settings))
{
    reader.ReadStartElement("DATASET");

    while (!reader.EOF)
    {
        if (reader.NodeType == XmlNodeType.Element)
        {
            try
            {
                XElement elR = XNode.ReadFrom(reader) as XElement;

                //parse the xml here and do stuff with it

            }
            catch (Exception ex)
            {
                Log.WriteLine(ex.Message);
                Log.WriteLine(ex.StackTrace);
            }
        }
        else
        {
            reader.Read();
        }
    }
}

我理解第一个是如何工作的......你发出请求,从服务器获取响应并将其解析为XDocument

但第二个如何运作?你怎么能一次只收回一条回复?整个回应不会立刻回来吗?这是如何运作的? XmlReader.Read如何一次只读取一行答案?

整个回复是否保存在内存中,XmlReader只是从中读取?或者每个XmlReader.Read调用实际从服务器获取内容?

0 个答案:

没有答案