Ich habe eine große XML-Datei (ca. 10 MB) in der folgenden einfachen Struktur:
%Vor%Ich muss schreiben einen neuen Knoten hinzufügen & lt; Error & gt; am Ende vor dem & lt; / Fehler & gt; Etikett. Was ist der schnellste Weg, dies in .net zu erreichen?
Sie müssen die XML-Einschlusstechnik verwenden.
Ihre error.xml (ändert sich nicht, nur ein Stub. Wird von XML-Parsern zum Lesen verwendet):
%Vor%Ihre Datei errorrows.txt (Änderungen, der XML-Parser versteht sie nicht):
%Vor%Dann, um einen Eintrag zu errorrows.txt hinzuzufügen:
%Vor% Oder Sie können sogar .NET 3.5 XElement verwenden und den Text an die StreamWriter
:
Siehe auch Microsoft-Artikel Effiziente Techniken zum Ändern großer XML-Dateien
Erstens würde ich System.Xml.XmlDocument disqualifizieren, weil ein DOM ist, das das Analysieren und Erstellen des gesamten Baums erfordert im Speicher, bevor es angehängt werden kann. Dies bedeutet, dass Ihr 10 MB Text mehr als 10 MB im Speicher ist. Dies bedeutet, dass es "speicherintensiv" und "zeitaufwendig" ist.
Zweitens würde ich System.Xml.XmlReader disqualifizieren, weil zuerst die gesamte Datei analysiert werden muss , bevor Sie dazu in der Lage sind der Punkt, an dem Sie es anhängen können. Sie müssten den XmlReader in einen XmlWriter kopieren, da Sie ihn nicht ändern können. Dazu müssen Sie zuerst Ihre XML-Daten im Speicher duplizieren, bevor Sie sie anhängen können.
Die schnellere Lösung für XmlDocument und XmlReader wäre eine String-Manipulation (die eigene Speicherprobleme hat):
%Vor%Entfernen Sie das End-Tag, fügen Sie den neuen Fehler hinzu und fügen Sie das End-Tag zurück.
Ich nehme an, Sie könnten damit verrückt werden und Ihre Datei um 9 Zeichen kürzen und anhängen. Würde die Datei nicht einlesen müssen und würde das Betriebssystem das Laden der Seite optimieren lassen (müsste nur im letzten Block oder so etwas laden).
%Vor%Das wird ein Problem verursachen, wenn Ihre Datei leer ist oder nur "& lt; Fehler & gt; & lt; / Fehler & gt;" enthält, die beide leicht durch Überprüfung der Länge behandelt werden können.
Der schnellste Weg wäre wahrscheinlich ein direkter Dateizugriff.
%Vor%Aber Sie verlieren alle netten XML-Funktionen und können die Datei leicht beschädigen.
Ich würde XmlDocument oder XDocument verwenden, um Ihre Datei zu laden und sie dann entsprechend zu bearbeiten.
Ich würde dann auf die Möglichkeit schauen, dieses XmlDocument im Speicher zwischenzuspeichern, damit Sie schnell auf die Datei zugreifen können.
Wofür brauchst du die Geschwindigkeit? Haben Sie bereits einen Performance-Engpass oder erwarten Sie einen?
So wird es in C gemacht. .NET sollte ähnlich sein.
Das Spiel besteht darin, einfach zum Ende der Datei zu springen, über das Tag zurückzuspringen, die neue Fehlerzeile anzuhängen und ein neues Tag zu schreiben.
%Vor% Die schnellste Methode ist wahrscheinlich das Lesen der Datei mit einem XmlReader
und repliziere einfach jeden gelesenen Knoten mit in einen neuen Stream XmlWriter
Wenn Sie zu dem Punkt kommen, an dem Sie das schließende </Errors>
-Tag finden, müssen Sie nur Ihr zusätzliches <Error>
-Element ausgeben, bevor Sie den Zyklus 'read and duplicate' fortsetzen. Dieser Weg wird zwangsläufig schwieriger als das Lesen des gesamten Dokuments in das DOM ( XmlDocument
-Klasse), aber für große XML-Dateien, viel schneller. Zugegeben, die Verwendung von StreamReader
/ StreamWriter
wäre zwar noch etwas schneller, aber im Code ziemlich schrecklich zu arbeiten.
Die Verwendung stringbasierter Techniken (wie das Suchen nach dem Ende der Datei und dann das Zurückziehen der Länge des schließenden Tags) ist anfällig für unerwartete, aber vollkommen legale Unterschiede in der Dokumentstruktur.
Das Dokument könnte mit einer beliebigen Anzahl von Leerzeichen enden, um das wahrscheinlichste Problem zu erkennen, auf das Sie stoßen. Es könnte auch mit einer beliebigen Anzahl von Kommentaren oder Verarbeitungsanweisungen enden. Und was passiert, wenn das Top-Level-Element nicht den Namen Error
hat?
Und hier ist eine Situation, in der die Verwendung der String-Manipulation nicht vollständig erkannt werden kann:
%Vor% Wenn Sie ein XmlReader
verwenden, um das XML zu verarbeiten, während es möglicherweise nicht so schnell ist wie das Suchen nach EOF, können Sie auch alle diese möglichen Ausnahmebedingungen behandeln.