create c# .net xml .net-3.5 streaming

create - Cómo hacer lectura de un gran archivo XML en C#3.5



xmldocument save to file c# (6)

Creo que no es posible si desea usar el modelo de objetos (es decir, XElement / XDocument) para consultar XML. Obviamente, no puede construir árbol de objetos XML sin leer suficientes datos. Sin embargo, puede usar la clase XmlReader .

La clase XmlReader lee datos XML de una secuencia o archivo. Proporciona acceso de solo lectura, de solo lectura y de solo lectura a los datos XML.

¿Cómo se puede hacer una lectura de transmisión en un archivo XML grande que contiene una secuencia xs: justo debajo del elemento raíz, sin cargar todo el archivo en una instancia de XDocument en la memoria?


Esa muestra de código intenta convertir el código de estilo de XmlReader en código de estilo SAX. Si está escribiendo código desde cero, simplemente usaría XmlReader como estaba previsto. Tire no presione.


Estoy confundido por la mención de "xs: sequence" - este es un elemento de esquema XML.

¿Estás tratando de abrir un gran archivo de esquema XML? ¿Está abierto un archivo XML grande que se basa en ese esquema? ¿O está tratando de abrir un archivo XML grande y validarlo al mismo tiempo?

Ninguna de estas situaciones debería proporcionarle un problema al utilizar XmlReader estándar (o XmlValidatingReader).

Lectura de XML con XMLReader: http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx



Ir con un analizador de elementos de estilo SAX y la clase XmlTextReader creada con XmlReader.Create sería una buena idea, sí. Aquí hay un ejemplo de código ligeramente modificado de CodeGuru :

void ParseURL(string strUrl) { try { using (var reader = XmlReader.Create(strUrl)) { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: var attributes = new Hashtable(); var strURI = reader.NamespaceURI; var strName = reader.Name; if (reader.HasAttributes) { for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); attributes.Add(reader.Name,reader.Value); } } StartElement(strURI,strName,strName,attributes); break; // //you can handle other cases here // //case XmlNodeType.EndElement: // Todo //case XmlNodeType.Text: // Todo default: break; } } } catch (XmlException e) { Console.WriteLine("error occured: " + e.Message); } } } }


No puedo agregar un comentario, ya que me acabo de registrar pero el código del ejemplo publicado por Hirvox y actualmente seleccionado como la respuesta tiene un error. No debería tener la new instrucción cuando se usa el método estático Create .

Corriente:

using (var reader = new XmlReader.Create(strUrl))

Fijo:

using (var reader = XmlReader.Create(strUrl))