我从外部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
调用实际从服务器获取内容?