我需要处理从ResponseStream逐渐装载在异步回调XML。

回复是具有:

  <root>
     <node ...>
        .....
     </node>
     <node />
     ...
  </root>

模式,我需要有能力处理<node>的他们到达之前完成。

是否有使用标准.NET解析它正常的方式?

有帮助吗?

解决方案

System.Xml.XmlTextReader 

“表示一个读取器,其提供了快速,非缓存,只进到XML数据的访问。”

http://msdn.microsoft.com/en -us /库/ system.xml.xmltextreader.aspx

编辑: 这是一个快速的黑客,但它确实表明,读者其实是在偷懒。

 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会发生什么),那么流将可在第一小盘

创建ResponseStream您的XMLReader的的GetResponse()返回时。它将开始从第一个块是可用的处理,并获得后续块到达时相当透明的,以你的代码。

请确保您处理这些节点上的可用的基础实际上进一步有利于代码沿线。例如。如果要输出到控制台或一个形式中,这样做的,因为每个节点进行处理(或一小批节点),而如果是从这些节点中创建对象,然后yield return它们,而不是建立的集合。

现在,这里的一件大事显然是网络流是否是分块的问题,而不是你的处理代码。如果生产者是另一方无法说服做到这一点,那么你将需要删除在你处理一个较低的水平。但是,如果这是然后做的情况下,这样很可能虚假的优化,整个处理将在他们的最终完成,他们发送的第一个字节之前,那就是是最大的延迟会。真的,如果得到整个响应下载的延迟是为您的代码有问题,那么你的需要他们开始发送分块的,即使是最有效的方法对您的部分仍然是太大的延迟

有关记录,我最近很证实,在上一个WebResponse的交易这样使用的XmlReader与分块数据(在这里我都控制在客户端和服务器端的代码,并可能都运行在一个调试器和检查的操作的顺序),则处理进行确实为每个块是可用的。

是的,有一个阅读器,就可以使用。沿着流基本上去,并会因每个元素它识别(元素,属性等)的事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top