Вопрос

Мне нужно обрабатывать, загруженные из ResponseStream На Async Callbacks XML постепенно.

Ответ есть:

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

Схема, и мне нужно иметь способность обрабатывать <node>прежде чем они прибудут завершены.

Есть ли обычный способ разбирать его с использованием стандартных .NET?

Это было полезно?

Решение

System.Xml.XmlTextReader 

«Представляет собой читатель, который обеспечивает быстрый, не кэшированный, дополнительный доступ только к данным XML».

http://msdn.microsoft.com/en-us/library/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;
        }
}

Другие советы

Не называйте это на Async Callbacks, вам не нужно (доверять мне, это станет яснее ...).

Ответный нагрузка будет загружаться, поскольку информация доступна. В случае небольшого (для довольно больших ценностей «маленький», который боюсь) поток, который не послал, сложился, это будет, когда весь поток был загружен. Однако, если поток отправляется с кодировкой изношенной передачи (это то, что происходит в ASP.NET, если буферизация выключена или Response.Flush() Называется, другие технологии веб-серверов имеют свои эквиваленты), то поток будет доступен на первом кусочке.

Создайте свой XMLReader от ResponseStream, когда возвратился GetResponse (). Он начнет обработку из первого доступного кусочка и получить последующие куски, поскольку они приходят довольно прозрачно в ваш код.

Убедитесь, что ваша работа с этими узлами на такой доступной основе на самом деле на самом деле пользуется кодом по всей линии. Например, если вы выводят на консоль или форму, сделайте так, как каждый узел обрабатывается (или небольшая партия узлов), тогда как вы создаете объекты из этих узлов, то yield return их вместо того, чтобы наращивать коллекцию.

Теперь большая вещь здесь явно дело в том, будет ли веб-поток, а не код обработки. Если продюсер является другой стороной, которая не может быть убеждена, чтобы сделать это, то вам нужно будет упасть на более низкий уровень в вашей обработке. Однако, если это так, то это то, что вполне вероятно, что ложная оптимизация, поскольку всю обработку будет выполнена на их конце, прежде чем отправлять первый байт, и то есть самая большая задержка будет. На самом деле, если задержка, чтобы задержать весь ответ, это проблема для вашего кода, то вы нужно они начнут посылать посылку, как задержка, даже самый эффективный подход на вашу роль, все еще будет слишком великой.

Для записи я совсем недавно подтвердил, что в таком использовании XMLREADER на Webresponse, имеющих отношение к оборудованным данным (где я контролировал код клиента, так и сервера, и мог бы иметь как в отладчике, и проверять по порядку эксплуатации ) обработка действительно выполняется, поскольку каждый кусок доступен.

Да, есть читатель, который вы можете использовать. BASICALICALY идет по потоку Adnd Brats n событие для каждого элемента, который он идентифицирует (элемент, атрибут и т. Д.).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top