2010-04-09 12 views
5

Se faccioUn XPathDocument carica l'intero documento xml?

XPathDocument doc = new XPathDocument("filename.xml"); 

fa che caricare l'intero documento in memoria? Sto scrivendo un'app per telefoni cellulari e il documento potrebbe archiviare molti dati che non devono mai essere caricati tutti contemporaneamente. I telefoni cellulari di solito non hanno troppa ram!

+0

interessante, un runtime C# per un telefono cellulare. – Anurag

risposta

5

Sì, l'intero documento XML è rappresentato nella memoria.

Una soluzione è dividere un documento XML di grandi dimensioni in molti più piccoli.

Oppure, in alternativa, è possibile scrivere il proprio XmlReader che ignorerà i sottotitoli indesiderati. È possibile passare questo XmlReader come argomento al costruttore XpathDocument(): è necessario mimetizzarlo come TextReader.

+0

Esiste un modo migliore per caricare determinate parti di un documento xml? Come solo alcuni tag? – Wires

+0

@wires: non è una soluzione di sistema, ma è possibile scrivere il proprio Xml Reader che ignorerà i sottotitoli indesiderati. È possibile passare questo XmlReader come argomento al costruttore XpathDocument(): è necessario camuffarlo come TextReader. :) –

-1

Si potrebbe provare l'altro costruttore XPathDocument(stream). Lo streaming del documento non utilizzerà la quantità di memoria disponibile.

Forse non dovresti dare un'occhiata a Linq to XML, poiché è più facile, più veloce da codificare e creare codice più bello che usare l'analisi SAX/DOM. Vedi questo post: How to Store data without using Database and how to retrieve them?

+1

L'utilizzo del costruttore Stream non ha alcun effetto sulla quantità di memoria che verrà utilizzata da XPathDocument. E Linq to XML non è più veloce di SAX (o usa un XmlReader, che è quello usato in .NET invece che in SAX), né, diversamente dall'uso di XmlReader, evita di leggere l'intero documento in memoria. –

+0

Per quanto riguarda il costruttore di stream, è per questo che ho scritto "potresti volere". D'altra parte, penso che dovresti dare un'occhiata a come Linq trasmette i dati e non carica un file completo in memoria. – ALOToverflow

+0

La classe XStreamingElement può scrivere un documento XML di grandi dimensioni senza creare un intero documento XML in memoria. Ma non è usato per la lettura. Quando la maggior parte delle persone parla di Linq to XML (come in entrambi gli esempi a cui si è collegati), stanno parlando di XDocument, e XDocument carica infatti l'intero documento XML in memoria. C'è qualche fantastico oggetto Linq che sto trascurando? Credimi, questo è qualcosa su cui mi piacerebbe essere sbagliato. –

1

Si potrebbe desiderare di guardare il XStreamingElement di LINQ to XML:

Rappresenta elementi di un albero XML che supporta l'uscita in streaming differita.

Questa classe consente di creare un albero XML che supporta l'output dello streaming rinviato . Si utilizza questa classe per creare un albero XML in modo molto simile per creare un albero XML utilizzando XElement. Tuttavia, c'è una differenza fondamentale . Quando si utilizza una query LINQ per specificare contenuto quando la creazione di un albero XML utilizzando XElement, la variabile query viene iterato al momento di costruzione della struttura XML, ed i risultati della query vengono aggiunti all'albero XML . Al contrario, quando si crea un albero XML utilizzando XStreamingElement, un riferimento alla variabile query è memorizzato nel XML albero senza essere iterato. Le query vengono iterate solo dopo la serializzazione. Questo consente di creare XML più grande alberi, pur mantenendo una più piccola occupazione di memoria.

Se sono in streaming da una fonte di ingresso , come ad esempio un file di testo, allora si può leggere un file di testo molto grande, e generare un grande documento XML , pur mantenendo una piccola memoria ingombro.

Problemi correlati