2011-08-05 15 views
11

Mi chiedevo se esiste una libreria .NET o uno strumento di terze parti per l'esecuzione di Entity Framework come le query LINQ su documenti XML. So che esiste già LINQ to XML che consente di eseguire query su un oggetto XDocument che è GIÀ caricato nella memoria, ma cosa succede se il documento XML è di dimensioni estremamente grandi (oltre un gigabyte)?Linq To XML, yield e altri

Mi piacerebbe avere un'opzione per passare questa query a un XmlReader piuttosto a un oggetto XDocument. È possibile uscire subito dalla scatola?

+0

Ok, dopo aver cercato un po 'di più che ho imbattuto in questa discussione: http://stackoverflow.com/questions/2441673/reading-xml-with-xmlreader-in-c E questo: http://blogs.msdn.com/b/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx Ho pensato di risolvere questo problema utilizzando quasi la tecnica esatta , ma manca ancora il pieno supporto e prestazioni migliori. –

risposta

3

Dai uno sguardo allo this codeplex project.

+0

Esattamente quello che stavo cercando, adoro il modo in cui è codificato! Grazie! –

1

Non credo che si avrà una soluzione che si adatta tutti documenti XML, ma si può farlo.

Vorrei creare una classe che implementa IEnumerable<T> e prende lo XmlReader in cui si desidera eseguire lo streaming.

Quindi, vorrei creare il tipo che verrà utilizzato per il parametro di tipo T nell'implementazione di IEnumerable<T>.

Una volta che avete che, nell'implementazione di GetEnumerator, si dovrebbe chiamare i vari Move* e Read* metodi sulla XmlReader che permetteranno di costruire la singola istanza di T.

Quando si dispone di un'istanza di T in mano, si utilizzerà yield return per ottenere l'articolo. Il resto del corpo di GetEnumerator si collegherà in modo appropriato durante lo streaming attraverso lo XmlReader.

Con questo in mano, si riverseranno istanze di T come si ottiene, senza dover caricare l'intero documento in memoria, in primo luogo.

È necessario testare, ovviamente, la quantità di documento che si desidera leggere alla volta.

+0

Grazie, ho trovato alcune soluzioni simili usando la tecnica che hai menzionato sopra, ma mi è piaciuto lo strumento di terze parti pubblicato su jdv. –