Cómo realizar una lectura en streaming de un archivo XML grande en C# 3.5
Pregunta
¿Cómo se puede realizar una lectura en streaming de 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?
Solución
Ir con un analizador de elementos estilo SAX y el Lector de texto XML clase creada con XmlReader.Crear 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);
}
}
}
}
Otros consejos
No puedo agregar un comentario, ya que me acabo de registrar, pero el ejemplo de código publicado por Hirvox y actualmente seleccionado como respuesta tiene un error.No debería tener el new
declaración cuando se utiliza la estática Create
método.
Actual:
using (var reader = new XmlReader.Create(strUrl))
Fijado:
using (var reader = XmlReader.Create(strUrl))
Creo que no es posible si quieres utilizar el modelo de objetos (es decir,XElement\XDocument) para consultar XML.Obviamente, no se puede crear un árbol de objetos XML sin leer suficientes datos.Sin embargo puedes usar Lector XML clase.
La clase XMLReader lee datos XML de una secuencia o archivo.Proporciona acceso no de lectura no de lectura no de acuerdo, solo de lectura a XML.
Aquí hay un cómo: http://support.microsoft.com/kb/301228/en-us Solo recuerde que no debe usar XmlTextReader sino XmlReader junto con XmlReader.Create.
Me confunde la mención de "xs:sequence": este es un elemento de esquema XML.
¿Está intentando abrir un archivo de esquema XML de gran tamaño?¿Está abierto un archivo XML grande basado en ese esquema?¿O está intentando abrir un archivo XML grande y validarlo al mismo tiempo?
Ninguna de estas situaciones debería suponer un problema al utilizar el XmlReader estándar (o XmlValidatingReader).
Lectura de XML con XMLReader: http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx
Ese ejemplo de código intenta convertir el código de estilo XmlReader en código de estilo SAX; si está escribiendo código desde cero, simplemente usaría XmlReader como estaba previsto: tirar, no empujar.