2010-11-15 20 views
8

Estoy jugando con el análisis de una secuencia XMPP XML. Lo difícil de la secuencia XML es que la etiqueta de inicio no se cierra hasta el final de la sesión, es decir, nunca se recibe un DOM completo.Lea XElement de XmlReader

<stream:stream> 
    <features> 
     <starttls /> 
    </features> 
    .... 
    network session persists for arbitrary time 
    .... 
</stream:stream> 

Necesito leer los elementos XML de la secuencia sin preocuparme de que el elemento raíz no se haya cerrado.

Idealmente, esto funcionaría pero no funciona y supongo que es porque el lector está esperando que se cierre el elemento raíz.

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

El código de abajo (que me prestó Jacob Reimers) hace el trabajo pero estoy esperando que hay una manera más eficiente que no implica la creación de un nuevo XmlReader y hacer el análisis de cadenas.

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

Respuesta

10

No debería necesitar trabajar con las cuerdas; usted debe poder utilizar XElement.Load en el subárbol:

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

Y tenga en cuenta que esto no es realmente un "nuevo" xml-lector - que está fuertemente ligado al lector externo (pero limitado a un conjunto de nodos).

+0

Dado su ejemplo, no puedo ver por qué XmlReader stanzaReader = XElement.Load (xmlReader.ReadSubtree()) no haría el trabajo. Todavía tendré el xmlReader en un bloque de uso y eso se encargará de cualquier limpieza. – sipwiz

+0

@sipwiz - en ese caso particular probablemente se saldría con la suya; Estoy profundamente arraigado: deseche * cada * 'IDisposable', de inmediato. 'stanzaReader' es un objeto diferente, en última instancia. –

+0

Las versiones anteriores del analizador de arrastre de .net esperarían 4kB a la vez para amortiguar. Es por eso que terminé portando el analizador XP de James Clark de C# para jabber-net. –