Como fazer streaming de leitura de um arquivo XML grande em C# 3.5
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?
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.