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);
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
@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. –
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. –