XmlTextReader vs. XDocument

Sono in grado di analizzare XML in .NET. Ora ho la scelta tra almeno XmlTextReader e XDocument . Ci sono dei confronti tra questi due (o qualsiasi altro parser XML contenuto nel framework)?

Forse questo potrebbe aiutarmi a decidere senza approfondire entrambi.

I file XML dovrebbero essere piuttosto piccoli, la velocità e l’utilizzo della memoria sono un problema minore rispetto alla facilità d’uso. 🙂

(Li userò da C # e / o IronPython.)

Grazie!

    Se sei felice di leggere tutto in memoria, usa XDocument . Ti renderà la vita molto più facile. LINQ to XML è un’adorabile API.

    Utilizzare un XmlReader (come XmlTextReader ) se è necessario gestire enormi file XML in modo streaming, in pratica. È un’API molto più dolorosa, ma consente lo streaming (ovvero si occupa solo di dati quando ne hai bisogno, in modo da poter passare attraverso un enorme documento e avere solo una piccola quantità di memoria alla volta).

    Esiste comunque un approccio ibrido: se hai un documento enorme formato da piccoli elementi, puoi creare un XElement da un XmlReader posizionato all’inizio dell’elemento, gestire l’elemento usando LINQ su XML, quindi spostare XmlReader sul elemento successivo e ricominciare.

    XmlTextReader è un po ‘deprecato, non usarlo.

    1. Dai blog msdn di XmlTeam

      Efficace Xml Parte 1: Scegli l’API corretta

      Evitare l’uso di XmlTextReader . Contiene alcuni bug che non possono essere risolti senza rompere le applicazioni già in uso.

      Il mondo è andato avanti, vero? API Xml da evitare.

      Le API obsolete sono semplici perché il compilatore aiuta a identificarle, ma ci sono altre due API da evitare, ovvero XmlTextReader e XmlTextWriter . Abbiamo riscontrato numerosi bug in queste classi che non siamo riusciti a risolvere senza interrompere le applicazioni esistenti. Il percorso facile sarebbe deprecare queste classi e chiedere alle persone di utilizzare invece le API sostitutive. Sfortunatamente queste due classi non possono essere contrassegnate come obsolete perché fanno parte dello standard ECMA-335 (Common Language Infrastructure) ( http://www.ecma-international.org/publications/standards/Ecma-335.htm ) – il compagno CLILibrary File .xml che fa parte della partizione IV).

      La buona notizia è che anche se queste classi non sono deprecate ci sono già API di sostituzione per queste in .NET Framework e spostarsi su di esse è relativamente facile. Innanzitutto è necessario trovare i luoghi in cui XmlTextReader o XmlTextWriter viene utilizzato (sfortunatamente è un passaggio manuale). Ora tutte le occorrenze di XmlTextReader devono essere sostituite con XmlReader e tutte le occorrenze di XmlTextWriter devono essere sostituite con XmlWriter (si noti che XmlTextReader deriva da XmlReader e XmlTextWriter deriva da XmlWriter quindi l’app può già utilizzarle come parametri formali). L’ultimo passaggio consiste nel modificare il modo in XmlWriter vengono XmlWriter oggetti XmlReader / XmlWriter . Invece di creare direttamente il lettore / scrittore, è necessario utilizzare il metodo statico factory .Create() presente su entrambe le API XmlReader e XmlWriter .

    2. Inoltre, intellisense in Visual Studio non elenca XmlTextReader nello spazio dei nomi System.Xml. La class è definita come:

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

    I metodi factory XmlReader.Create restituiscono altre implementazioni interne della class astratta XmlReader base alle impostazioni passate.


    Per l’API di streaming forward-only (ovvero che non carica l’intera cosa in memoria), utilizzare XmlReader tramite il metodo XmlReader.Create .

    Per un’API più semplice con cui lavorare, vai su XDocument aka LINQ To XML. Trova XDocument vs XmlDocument qui e qui .