XmlTextReader vs. XDocument

Estoy en posición de analizar XML en .NET. Ahora puedo elegir entre al menos XmlTextReader y XDocument . ¿Hay alguna comparación entre esos dos (o cualquier otro analizador XML contenido en el marco)?

Tal vez esto podría ayudarme a decidir sin probar ambos en profundidad.

Se espera que los archivos XML sean bastante pequeños, la velocidad y el uso de memoria son un problema menor en comparación con la facilidad de uso. 🙂

(Voy a usarlos desde C # y / o IronPython).

¡Gracias!

Si está contento de leer todo en la memoria, use XDocument . Te hará la vida mucho más fácil. LINQ to XML es una hermosa API.

Use un XmlReader (como XmlTextReader ) si necesita manejar grandes archivos XML en forma de transmisión, básicamente. Es una API mucho más dolorosa, pero permite la transmisión (es decir, solo trata los datos cuando los necesita, de modo que puede ir a través de un documento enorme y solo tener una pequeña cantidad en la memoria a la vez).

Sin embargo, hay un enfoque híbrido: si tiene un gran documento compuesto por elementos pequeños, puede crear un XElement partir de un XmlReader ubicado al comienzo del elemento, tratar el elemento usando LINQ a XML, luego mover el XmlReader al siguiente elemento y comenzar de nuevo.

XmlTextReader está algo obsoleto, no lo use.

  1. De msdn blogs de XmlTeam

    Xml efectivo Parte 1: elige la API correcta

    Evite usar XmlTextReader . Contiene bastantes errores que no se pueden arreglar sin romper las aplicaciones existentes que ya lo usan.

    El mundo ha avanzado, ¿verdad? API Xml que debes evitar usar

    Las API obsoletas son fáciles, ya que el comstackdor ayuda a identificarlas, pero hay dos API más que debes evitar usar: a saber, XmlTextReader y XmlTextWriter . Encontramos una serie de errores en estas clases que no pudimos solucionar sin romper las aplicaciones existentes. La ruta fácil sería desaprobar estas clases y, en su lugar, pedirle a las personas que utilicen las API de reemplazo. Desafortunadamente estas dos clases no se pueden marcar como obsoletas porque son parte del estándar ECMA-335 (Common Language Infrastructure) ( http://www.ecma-international.org/publications/standards/Ecma-335.htm ) – la compañia CLILibrary archivo .xml que es parte de la Partición IV).

    La buena noticia es que, aunque estas clases no están en desuso, ya hay API de reemplazo para estas en .NET Framework y cambiar a ellas es relativamente fácil. En primer lugar, es necesario encontrar los lugares donde XmlTextReader o XmlTextWriter se utilizan (desafortunadamente es un paso manual). Ahora todas las XmlTextReader de XmlTextReader deberían reemplazarse por XmlReader y todas las apariciones de XmlTextWriter deberían reemplazarse por XmlWriter (tenga en cuenta que XmlTextReader deriva de XmlReader y XmlTextWriter deriva de XmlWriter por lo que la aplicación ya puede usar estos, por ejemplo, como parámetros formales). El último paso es cambiar la forma en que se XmlReader XmlWriter objetos XmlReader / XmlWriter . En lugar de crear el lector / escritor directamente, es necesario que el método de fábrica estática .Create() XmlReader presente en las API XmlReader y XmlWriter .

  2. Además, intellisense en Visual Studio no muestra XmlTextReader bajo el espacio de nombres System.Xml. La clase se define como:

     [EditorBrowsable(EditorBrowsableState.Never)] public class XmlTextReader : XmlReader, IXmlLineInfo, IXmlNamespaceResolver 

Los métodos de fábrica XmlReader.Create devuelven otras implementaciones internas de la clase abstracta XmlReader según la configuración aprobada.


Para la API de transmisión directa (es decir, que no carga todo en la memoria), use XmlReader mediante el método XmlReader.Create .

Para una API más fácil para trabajar, vaya a XDocument aka LINQ To XML. Encuentre XDocument vs XmlDocument aquí y aquí .