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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top