2010-11-15 14 views
8

Ich spiele gerade mit dem Parsen eines XMPP XML-Streams. Das Schwierige an dem XML-Stream ist, dass das Start-Tag nicht bis zum Ende der Sitzung geschlossen wird, d. H. Ein vollständiges DOM wird niemals empfangen.XElement aus XmlReader lesen

Ich muss die XML-Elemente aus dem Stream lesen, ohne darauf zu achten, dass das Stammelement nicht geschlossen wurde.

Idealerweise würde das funktionieren, aber es funktioniert nicht und ich nehme an, es liegt daran, dass der Leser darauf wartet, dass das Stammelement geschlossen wird.

XElement someElement = XNode.ReadFrom(xmlReader) as XElement; 

Der Code (die ich von Jacob Reimers geliehen) funktioniert, aber ich hoffe, es ist ein effizienter Weg, der nicht einen neuen XmlReader und tut das Zeichenfolgenanalyse beinhaltet nicht zu schaffen.

XmlReader stanzaReader = xmlReader.ReadSubtree(); 
stanzaReader.MoveToContent(); 
string outerStanza = stanzaReader.ReadOuterXml(); 
stanzaReader.Close(); 
XElement someElement = XElement.Parse(outerStanza); 

Antwort

10

Sie sollten nicht mit den Strings arbeiten müssen; Du soll Lage seines XElement.Load auf dem Teilbaum zu verwenden:

XElement someElement; 
using(XmlReader stanzaReader = xmlReader.ReadSubtree()) { 
    someElement = XElement.Load(stanzaReader); 
} 

Und beachten Sie, dass dies nicht wirklich ein „neuer“ xml-Leser ist - es stark auf den äußereen Leser gebunden ist (aber mit einem Satz gezwungen von Knoten).

+0

Angesichts Ihres Beispiels kann ich nicht sehen, warum XmlReader stanzaReader = XElement.Load (xmlReader.ReadSubtree()) würde nicht die Aufgabe erledigen. Ich habe immer noch den XmlReader in einem using-Block und das kümmert sich um alle Aufräumarbeiten. – sipwiz

+0

@sipwiz - in diesem speziellen Fall würden Sie wahrscheinlich damit durchkommen; Ich bin nur tief verwurzelt: entsorgen Sie sofort alle "IDisposable". 'stanzaReader' ist letztendlich ein anderes Objekt. –

+0

Frühere Versionen des .net-Pull-Parsers würden jeweils 4 KB auf Puffer warten. Aus diesem Grund habe ich James Clarks XP-Parser von Java nach C# für jabber-net portiert. –