2010-04-09 5 views
5

Wenn ichLädt ein XPathDocument das gesamte XML-Dokument?

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

Does, dass das gesamte Dokument in den Speicher geladen? Ich schreibe eine Handy-App und das Dokument speichert möglicherweise viele Daten, die nicht alle zur gleichen Zeit geladen werden müssen. Mobiltelefone haben normalerweise nicht viel RAM!

+0

interessant, eine C# -Laufzeit für ein Mobiltelefon. – Anurag

Antwort

5

Ja, das gesamte XML-Dokument wird im Speicher dargestellt.

Eine Lösung besteht darin, ein großes XML-Dokument in viele kleinere aufzuteilen.

Oder alternativ können Sie Ihre eigenen XmlReader schreiben, die unerwünschte Teilbäume ignorieren. Sie können diese XmlReader als Argument an den XpathDocument() Konstruktor übergeben - müssen Sie es als TextReader tarnen.

+0

Gibt es eine bessere Möglichkeit, bestimmte Teile eines XML-Dokuments zu laden? Wie nur bestimmte Tags? – Wires

+0

@wires: Keine Systemlösung, aber Sie können Ihren eigenen XmlReader schreiben, der unerwünschte Teilbäume ignoriert. Sie können diesen XmlReader als Argument an den XpathDocument() -Konstruktor übergeben - müssen Sie ihn als TextReader tarnen. :) –

-1

Sie können den anderen Konstruktor XPathDocument(stream) ausprobieren. Das Streaming des Dokuments wird nicht so viel Speicher belegen.

Vielleicht sollten Sie sich die Linq to XML ansehen, da es einfacher und schneller ist, Code zu schreiben und schöneren Code zu erstellen, als das SAX/DOM-Parsing zu verwenden. Siehe diesen Beitrag: How to Store data without using Database and how to retrieve them?

+1

Die Verwendung des Stream-Konstruktors hat keine Auswirkung auf die Speichermenge, die das XPathDocument verwenden wird. Und Linq to XML ist nicht schneller als SAX (oder verwendet einen XmlReader, der in .NET anstelle von SAX verwendet wird), oder - im Gegensatz zur Verwendung eines XmlReader - vermeidet es das Lesen des gesamten Dokuments in den Speicher. –

+0

In Bezug auf den Stream-Konstruktor, deshalb habe ich geschrieben "Sie könnten wollen". Andererseits denke ich, dass Sie sich ansehen sollten, wie Linq die Daten streamt und nicht eine komplette Datei in den Speicher lädt. – ALOToverflow

+0

Die XStreamingElement-Klasse kann ein sehr großes XML-Dokument schreiben, ohne ein vollständiges XML-Dokument im Arbeitsspeicher zu erstellen. Aber es wird nicht zum Lesen verwendet. Wenn die meisten Leute über Linq zu XML sprechen (wie in beiden Beispielen, mit denen Sie verlinkt haben), sprechen sie von XDocument, und XDocument lädt tatsächlich das gesamte XML-Dokument in den Speicher. Gibt es ein tolles Linq-Objekt, das ich übersehen habe? Glauben Sie mir, das ist etwas, worüber ich gerne falsch liegen würde. –

1

Sie könnten am XStreamingElement von LINQ to XML aussehen sollen:

Stellen Elemente in einem XML-Baum, die aktive latente Streaming-Ausgabe unterstützt.

Mit dieser Klasse können Sie einen XML-Baum erstellen, der die Ausgabe von verzögertem Streaming unterstützt. Mit dieser Klasse erstellen Sie eine XML-Baumstruktur in sehr ähnlicher Weise zum Erstellen einer XML-Struktur mit XElement. Es gibt jedoch einen grundlegenden Unterschied zwischen . Wenn Sie eine LINQ-Abfrage verwenden, um Inhalte zu spezifizieren, wenn eine XML-Struktur zu schaffen XElement verwenden, die Abfrage Variable an der Zeit des Baus der XML-Struktur wiederholt wird, werden und die Ergebnisse der Abfrage zu der XML-Struktur hinzugefügt . Wenn Sie im Gegensatz dazu eine XML-Struktur mit XStreamingElement erstellen, wird eine Referenz auf die Abfragevariable im Baum XML gespeichert, ohne iteriert zu werden. Abfragen werden nur bei der Serialisierung iteriert. Dies ermöglicht es Ihnen, größere XML-Bäume zu erstellen, während eine kleinere Speicherabdruck beibehalten.

Wenn Sie das Streaming von einer Eingang Quelle, wie zum Beispiel einer Textdatei, dann Sie eine sehr große Textdatei lesen kann, und ein sehr großes XML-Dokument erzeugen, während eine kleine Speicher Fußabdruck zu halten.

Verwandte Themen