Pergunta

Como você pode fazer uma leitura de streaming em um arquivo XML grande que contém um xs:sequence logo abaixo do elemento raiz, sem carregar o arquivo inteiro em uma instância XDocument na memória?

Foi útil?

Solução

Optando por um analisador de elementos no estilo SAX e o XmlTextReader classe criada com XmlReader.Create seria uma boa ideia, sim.Aqui está um exemplo de código ligeiramente 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);
      }
    }
  }
}

Outras dicas

Não consigo adicionar um comentário, pois acabei de me inscrever, mas o exemplo de código postado por Hirvox e atualmente selecionado como resposta contém um bug.Não deveria ter o new declaração ao usar o estático Create método.

Atual:

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

Fixo:

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

Acho que não é possível se você quiser usar o modelo de objeto (ou seja,XElement\XDocument) para consultar XML.Obviamente, você não pode construir uma árvore de objetos XML sem ler dados suficientes.No entanto, você pode usar Leitor XML aula.

A classe XMLReader lê dados XML de um fluxo ou arquivo.Ele fornece acesso não-compacto, somente para a frente e somente leitura aos dados XML.

Aqui está um tutorial: http://support.microsoft.com/kb/301228/en-us Lembre-se de que você não deve usar XmlTextReader, mas sim XmlReader em conjunto com XmlReader.Create

Estou confuso com a menção de "xs:sequence" - este é um elemento do esquema XML.

Você está tentando abrir um arquivo grande de esquema XML?Você está abrindo um arquivo XML grande baseado nesse esquema?Ou você está tentando abrir um arquivo XML grande e validá-lo ao mesmo tempo?

Nenhuma dessas situações deve causar problemas ao usar o XmlReader padrão (ou XmlValidatingReader).

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

Esse exemplo de código tenta transformar o código do estilo XmlReader em código do estilo SAX - se você estiver escrevendo o código do zero, eu usaria o XmlReader como pretendido - Pull, não Push.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top