Convertendo StreamReader para XmlReader em .Net 2.0/C#

No mundo da programação .NET, trabalhar com arquivos XML é uma tarefa comum, especialmente ao lidar com conjuntos de dados. Se você já se encontrou tentando converter um StreamReader em um XmlReader e esbarrou em um problema, você não está sozinho.

Neste post do blog, vamos detalhar um problema comum enfrentado durante essa conversão e explorar como abordá-lo efetivamente.

O Problema

Você está tentando converter um DataSet .NET em um fluxo XML, aplicar uma transformação XSL na memória e escrever o XML modificado em um novo arquivo. No entanto, dificuldades surgem ao criar um XmlReader a partir de um StreamReader que parece não ter dados.

Aqui está uma visão geral do seu código tentado:

BufferedStream stream = new BufferedStream(new MemoryStream());
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(stream);

StreamReader sr = new StreamReader(stream, true);
stream.Position = 0; // Posição redefinida para leitura

XmlReader reader = XmlReader.Create(sr, null); // Problema ocorre aqui

O principal problema é que o XmlReader está sendo criado sem reconhecer qualquer dado do StreamReader.

Entendendo a Causa

As principais questões observadas no código:

  • Posicionamento do Stream: A posição do stream deve ser redefinida para permitir que o StreamReader leia a partir do início do stream.
  • Fechamento do Stream: O manuseio adequado do stream, incluindo o fechamento ou descarte após a gravação, é crucial para a integridade dos dados.

A Solução

Aqui está uma abordagem simples para resolver os problemas com seu código existente:

Passo 1: Redefinir a Posição do Stream

Antes de ler a partir do StreamReader, certifique-se de que a posição do BufferedStream está redefinida. Isso pode ser alcançado com o método Seek ou definindo a propriedade Position diretamente.

Passo 2: Criar Corretamente o XmlReader

Crie um novo XmlReader após assegurar que o stream esteja posicionado adequadamente no início.

Passo 3: Implementar o Código Funcional

Aqui está um exemplo funcional de como realizar essas operações:

BufferedStream stream = new BufferedStream(new MemoryStream());
stream.Write(Encoding.ASCII.GetBytes("<xml>foo</xml>"), 0, "<xml>foo</xml>".Length);
stream.Seek(0, SeekOrigin.Begin); // Importante: Redefinir a posição do stream

using (StreamReader sr = new StreamReader(stream))
{
    using (XmlReader reader = XmlReader.Create(sr))
    {
        while (reader.Read())
        {
            Console.WriteLine(reader.Value);
        }
    }
}

Explicação do Código:

  • Gravando no Stream: Aqui, estamos gravando uma estrutura XML simples no stream.
  • Redefinindo a Posição: Ao usar Seek(0, SeekOrigin.Begin), garantimos que nosso leitor de stream comece do início.
  • Lendo com XmlReader: O XmlReader.Create(sr) lê o XML, e agora podemos exibir seu conteúdo.

Conclusão

Ao garantir o manuseio adequado do stream e redefini-lo para a posição correta, você pode evitar as armadilhas encontradas ao converter um StreamReader em um XmlReader em .Net 2.0/C#. Lidar com XML no .NET pode ser simples se prestarmos atenção ao gerenciamento do nosso stream.

Implemente essas mudanças e você deverá ver uma melhora significativa em suas capacidades de manipulação de XML!