ResponseStream
加载的XML。答复如下: <root>
<node ...>
.....
</node>
<node />
...
</root>
我需要翻译关于IT技术的内容,具体是关于schema的处理。我需要能够在节点完整到达之前对<node>
进行处理。
是否有使用标准.NET解析它的常规方法?
ResponseStream
加载的XML。答复如下: <root>
<node ...>
.....
</node>
<node />
...
</root>
我需要翻译关于IT技术的内容,具体是关于schema的处理。我需要能够在节点完整到达之前对<node>
进行处理。
是否有使用标准.NET解析它的常规方法?
System.Xml.XmlTextReader
public class XmlTextReaderTest
{
public void RunTest()
{
var fs = new XmlTextReader(new Fs(@"c:\TestXml.xml"));
while (fs.Read())
File.AppendAllText(@"c:\xLog.txt", "Processing node..." + Environment.NewLine);
}
}
public class Fs : FileStream
{
public Fs(string path)
: base(path, FileMode.Open)
{
}
public override int Read(byte[] array, int offset, int count)
{
File.AppendAllText(@"c:\xLog.txt", "Reading from stream..." + Environment.NewLine);
var ans = base.Read(array, offset, count);
return ans;
}
}
不要在异步回调上调用它,你不需要这样做(相信我,这会变得更清晰...)。
ResponseStream将在信息可用时加载。对于小流(对于相当大的“小”值,恐怕是这样),如果没有以块发送,则在整个流被下载时就会发生这种情况。但是,如果使用分块传输编码发送流(如果关闭缓冲或调用Response.Flush()
,则在ASP.NET中会发生这种情况,其他Web服务器技术也有其等效物),则流将在第一个块处可用。
从GetResponse()返回时从ResponseStream创建XMLReader。它将从第一个可用块开始处理,并且透明地获取随后到达的块,以便您的代码。
确保按照可用的方式处理这些节点实际上有助于沿着线路进一步进行代码。例如,如果要输出到控制台或表单,请在处理每个节点(或一小批节点)时执行此操作,而如果要从这些节点创建对象,则应yield return
它们而不是建立集合。
现在,重要的事情显然是网络流是否分块,而不是你的处理代码。如果生产者是另一方,无法说服他们这样做,那么您将需要降低处理级别。但是,如果是这种情况,则这样做很可能是一种虚假优化,因为整个处理将在他们发送第一个字节之前完成,并且这是最大的延迟所在。实际上,如果获取整个响应下载的延迟对您的代码造成问题,则需要让他们开始发送分块,因为即使您采用最有效的方法,延迟仍然太大。
值得一提的是,我最近确认,在使用XmlReader处理分块数据的WebResponse时(其中我控制了客户端和服务器端代码,并且可以在调试器中运行并检查操作顺序),每个块可用时确实进行处理。
是的,有一个你可以使用的读取器。基本上沿着流程走,并为其识别的每个元素(元素、属性等)抛出一个事件。