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);