Wie können Sie eine große XML-Datei streamen, die eine xs: Sequenz direkt unter dem Stammelement enthält, ohne die gesamte Datei in eine XDocument-Instanz im Speicher zu laden ?Streaming-Lesevorgang einer großen XML-Datei in C# 3.5
Antwort
Möchten Sie einen SAX-Parser Stilelement und dem XmlTextReader mit XmlReader.Create erstellte Klasse wäre eine gute Idee sein, ja. Hier ist ein leicht modifizierten Codebeispiel aus CodeGuru:
void ParseURL(string strUrl)
{
try
{
using (var reader = XmlReader.Create(strUrl))
{
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
var attributes = new Hashtable();
var strURI = reader.NamespaceURI;
var strName = reader.Name;
if (reader.HasAttributes)
{
for (int i = 0; i < reader.AttributeCount; i++)
{
reader.MoveToAttribute(i);
attributes.Add(reader.Name,reader.Value);
}
}
StartElement(strURI,strName,strName,attributes);
break;
//
//you can handle other cases here
//
//case XmlNodeType.EndElement:
// Todo
//case XmlNodeType.Text:
// Todo
default:
break;
}
}
}
catch (XmlException e)
{
Console.WriteLine("error occured: " + e.Message);
}
}
}
}
Ich denke, es ist nicht möglich, wenn Sie Objektmodell (d. H. XElement \ XDocument) XML abfragen möchten. Natürlich können Sie keine XML-Objekte erstellen, ohne genügend Daten zu lesen. Sie können jedoch XmlReader Klasse verwenden.
Die XmlReader-Klasse liest XML-Daten aus einem Stream oder einer Datei. Es bietet non-cached, nur vorwärts, schreibgeschützt Zugriff auf XML-Daten.
Heres ist ein Howto: http://support.microsoft.com/kb/301228/en-us Denken Sie daran, dass Sie nicht XmlTextReader sondern XmlReader in Verbindung mit XmlReader.Create
Ich bin verwirrt durch die Erwähnung der Verwendung sollte „xs: sequence“ - das ist ein XML-Schemaelement
Versuchen Sie, eine große XML-Schema-Datei zu öffnen? Öffnen Sie eine große XML-Datei, die auf diesem Schema basiert? Oder versuchen Sie, eine große XML-Datei zu öffnen und gleichzeitig zu validieren?
Keine dieser Situationen sollte Ihnen ein Problem mit dem Standard XmlReader (oder XmlValidatingReader) bieten.
Lesen von XML mit XMLReader: http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx
Das Codebeispiel versucht XmlReader Artcode in SAX Artcode zu drehen - wenn Sie Code von Grund auf neu zu schreiben sind würde ich nur XmlReader verwenden, wie es beabsichtigt war - Ziehen nicht drücken.
Ich kann keinen Kommentar hinzufügen, da ich mich gerade angemeldet habe, aber das von Hirvox veröffentlichte und als Antwort ausgewählte Beispiel hat einen Fehler. Es sollte die new
-Anweisung nicht verwenden, wenn die statische Methode Create
verwendet wird.
Aktuell:
using (var reader = new XmlReader.Create(strUrl))
Korrigiert:
using (var reader = XmlReader.Create(strUrl))
Danke, das habe ich behoben! –
- 1. Refactoring einer großen C++ Funktion
- 2. Organisieren einer großen C# -Lösung
- 3. C#: Optimieren einer großen Array-Kopie
- 4. Suchen von Werten in einer großen Matrix
- 5. Collections Frage (.NET 3.5, C#)
- 6. Finden von "totem Code" in einer großen C++ Altanwendung
- 7. So lesen Sie Teildaten aus einer großen Textdatei in C++
- 8. Zeichnen einer großen Anzahl von Bildern in C# Windows Forms
- 9. Verwalten einer großen Anzahl von Einstellungen in einer C# WinForms-Anwendung?
- 10. Gotcha/Überraschungen in C# .net 3.5
- 11. Senden von E nicht in C# 3.5
- 12. C# Speichern von großen Bildern
- 13. Sortierung einer großen Datenmenge Excel
- 14. C#. Net 3.5 Code zum Ersetzen einer Dateierweiterung mit LINQ
- 15. Umstrukturierung einer großen Datenmatrix
- 16. Initialisieren großen zweidimensionalen Array in C++
- 17. partielles Rendering einer großen Tabelle in jQuery
- 18. Erstellen einer Tabelle in Python 3.5
- 19. C#, ASP.NET 3.5 - Code zur Laufzeit laden
- 20. C++ main() in einem großen OOP Projekt
- 21. Dekodierung großen JSON-Dateien in C#
- 22. Computing MD5SUM von großen Dateien in C#
- 23. Umgang mit großen Zahlen in C++?
- 24. Verwalten von großen Objekten in C#
- 25. Formatieren von großen Zahlen in C#
- 26. Konvertieren eines Datasets in JSON mit .NET 3.5 in C#
- 27. C: Darstellung von großen Ganzzahlen
- 28. 3.5
- 29. Eine Zeichenfolge in einer großen Textdatei abgleichen?
- 30. Speichern eines großen Arrays in einer Datenbank
Ein paar Dinge, die ich bemerkt: Die catch-Anweisung ist an der falschen Stelle (nach der zweiten bis letzten schließenden geschweiften Klammer sein sollte) und Es gibt eine zusätzliche schließende geschweifte Klammer nach der letzten break-Anweisung (es versucht, die case-Anweisung zu schließen, aber Sie schließen nur die switch-Anweisung). Außerdem kann ich nicht herausfinden, woher die StartElement-Methode stammt, oder soll das eine Dummy-Methode sein, die durch Benutzercode ersetzt werden soll? –