por Cesar Cassiano Schimanco

XML lento ao carregar C#


Em termos de desempenho o XmlDocument, XmlTextReader e XDocument não tem muita diferença com até 500 itens. A partir dai o XmlTextReader se destaca, enquanto o XmlDocument e XDocument vão ficando bem mais lentos.
O XmlTextReader é o mais rápido, depois o XDocument e por último o XmlDocument.
Mas o que pode fazer o XML ficar muito lento para carregar é o DTD - Document Type Declaration.
Quando o XML tem DTD declarado, ele vai ser validado durante a leitura e interpretação do arquivo XML.
A lentidão na leitura de XML ocorre quando o DTD é externo, e se agrava quando o arquivo DTD importa outros dados externos. Ou seja, o .dtd pode fazer "import" de outros dados externos.


No exemplo que vou mostra o DTD é este abaixo.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Quando o DTD não faz referência a dados externos, podemos armazená-lo localmente no mesmo diretório do XML e mudar a chamada do .dtd como mostrado na linha abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd">

A nível de código, existe outra alternativa. Podemos ignorar o DOCTYPE na leitura de XML, basta utilizar o XmlReaderSettings para definir as configurações de validação.
Mas lembre-se, algumas vezes DTD pode ser essencial, então ignora-lo pode causar problemas.


Exempo 1 - Para poder utilizar o XmlReaderSettings vamos substituir o XmlTextReader por XmlReader.
Antes:

//Lendo XML com XmlTextReader
XmlTextReader reader = new XmlTextReader(Server.MapPath("~/exemplo.xml"));

Depois:

//Definir as configurações de validação
XmlReaderSettings settings = new XmlReaderSettings();
//Use XmlReaderSettings.DtdProcessing para Framework 4, 4.5
settings.DtdProcessing = DtdProcessing.Ignore;
//Criar um XmlReader com as validações definidas acima
XmlReader reader = XmlTextReader.Create(Server.MapPath("~/exemplo.xml"), settings);

 

Exemplo 2 - Utilizar XmlDocument com XmlReader e XmlReaderSettings
Antes

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("~/exemplo.xml"));

Depois:

//Definir as configurações de validação
XmlReaderSettings settings = new XmlReaderSettings();
//Use XmlReaderSettings.DtdProcessing para Framework 4, 4.5
settings.DtdProcessing = DtdProcessing.Ignore;
//Criar um XmlReader com as validações definidas acima
XmlReader xmlReader = XmlTextReader.Create(Server.MapPath("~/exemplo.xml"), settings);
XmlDocument xmlDoc = new XmlDocument();
//Ler o XML a partir do XmlReader
xmlDoc.Load(xmlReader);

 

Comentários

Carregando comentários

Postar um novo comentário



Processando...