2014-09-02 2 views
1

Я получаю «куски» xml в потоке ответов HTTP. Каждый блок представляет собой полную мини-иерархию XML, такие как:Как читать в XElement непрерывный поток XML по HTTP

<chunk1> 
    <id>1</id> 
    <data>blah blah-blah</data> 
</chunk1> 
... 
(30 seconds later) 
... 
<chunk2> 
    <id>2</id> 
    <data>blah blah-blah</data> 
</chunk2> 
... 
(30 seconds later) 
... 
<chunk1> 
    <id>3</id> 
    <data>blah blah-blah</data> 
</chunk1> 

Что такое лучший способ в C#, чтобы прочитать каждый «кусок» в XElement для дальнейшей обработки? Каждый кусок может иметь другой корневой элемент.

Я видел ответы на similar questions. Однако ответы не казались оптимальными, поскольку они включали обработку каждого узла. Я просто хочу прочитать поток до тех пор, пока не доберусь до закрывающего узла, соответствующего начальному блоку узла, не передам весь фрагмент в XElement, вызовет метод для его обработки, а затем дождитесь следующего фрагмента.

+0

Чтение ломти в 'StringBuilder' или какой-то список не хватает? – Mrchief

+0

Мне нужно было знать, когда прекратить чтение (т. Е. Когда был достигнут закрывающий корневой элемент)? – Jimmy

+0

Ох, я вижу сейчас. Итак, возможно ли, что ответный кусок может содержать частичный кусок для следующих или предыдущих кусков? Если нет (т. Е. Кусок всегда является единственным узлом), тогда все становится проще. – Mrchief

ответ

1

Это делает то, что я искал:

XmlReader reader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment }); 

while (reader.Read()) 
{ 
    using (XmlReader subTreeReader = reader.ReadSubtree()) 
    { 
    XElement xmlData = XElement.Load(subTreeReader); 
    Process(xmlData); 
    } 
} 
Смежные вопросы