C# Grosses XML am sinnvollsten auslesen

domidragon

Fleet Admiral
Registriert
Juli 2008
Beiträge
11.532
Huhu

Wie kann man grosse XMl Files mit vielen Elementen und "Baumstrukturen" am einfachsten und sinnvollsten in C# auslesen, damit man nachher auch ein Abbild von der Struktur hat.

Mom. versuche ich mich mit manuellem auslesen der Tag, Elementen etc. Kann das dann aber nicht gescheit speichern und ist mom. nur sehr mühsam.

Es handelt sich um ca. 15000 einträge...

Hab zuvor noch nie mit XML gearbeitet, die letzten Tage mich aber reingearbeitet und ja, die theorie kappiere ich soweit, aber es gibt so viele arten, wie man es auslesen kann und mit keiner schaffe ich es vernünpftig, hab grad ein durcheinander.

Danke für die Hilfe

greez
 
Hi Spontan würden mir die zwei .net Klassen XmlReader und XmlDocument einfallen.
XMLReader ist bei Großen Dateien zu bevorzugen, da er sie von vorne bis hinten Durchließt und nicht die Komplette struktur speichert.
XmlDocument bietet dagegen XPath und Navigationsmöglichkeiten innerhalb der Datei.

Im Inet gibts viele Beispiele dazu.

Leichter finde ich XmlDocument, benötigt aber mehr speicher!
 
Wie groß ist die Datei effektiv im Dateisystem, alles was im 1-stellinen MB bereich ist kannst ohne prob mit DOM bearbeiten (XmlDocument) darüber wirds dann schwierig und man sollte SAX verwenden (XmlReader)
 
Ich würde dazu die Klassen im System.Xml.Linq Namespace verwenden, da das Arbeiten damit am einfachsten ist. Also laden mit XElement.Load
Code:
XElement rootelement = XElement.Load("datei.xml");
Anschließend kann man mit LINQ to XMLdie benötigten Daten aus die im Speicher liegenden XML-Daten extrahieren.
 
leimers Vorschlag ist mMn auch nicht schlecht, da der Code wohl am lesbarsten sein wird, jedoch werden LINQ Kenntnisse benötigt und ressourcenschonend ist die Sache auch nicht.

Musst Du bestimmte Daten aus den Files lesen? <-XmlDocument+XPath oder LINQ to XML
Brauchst Du die Struktur und willst Du sie (samt Daten) nur Darstellen? Xml(Text)Reader

Edit:
Beispiel XmlReader - Ausgabe des Inhalts + Struktur in ein TreeView:

//trvDatei ist ein .net System.Windows.Forms.TreeView

private void XmlEinlesen(string datei)
{
XmlReader xmlReader;
TreeNode trvAktuell, trvEltern;

xmlReader = XmlReader.Create(datei);

this.trvDatei.BeginUpdate();
this.trvDatei.Nodes.Clear();

trvEltern = this.trvDatei.Nodes.Add(Path.GetFileName(datei));

while (xmlReader.Read())
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
trvAktuell = new TreeNode(xmlReader.Name);
trvEltern.Nodes.Add(trvAktuell);

if (!xmlReader.IsEmptyElement)
trvEltern = trvAktuell;

while (xmlReader.MoveToNextAttribute())
{
trvEltern.Nodes.Add(xmlReader.Name + " - " + xmlReader.Value).ForeColor = Color.Green; ;
}

break;
case XmlNodeType.EndElement:
trvEltern = trvEltern.Parent;
break;

case XmlNodeType.Text:
trvEltern.Nodes.Add(xmlReader.Value).ForeColor=Color.Blue;
break;
}
}

xmlReader.Close();
this.trvDatei.EndUpdate();
this.trvDatei.ExpandAll();
}
 
Zuletzt bearbeitet:
Ist die Datenstrutur gleich, oder aendert sie sich?

Ich wurde einfach eine Klasse erstellen, damit kannst du sie ganz leicht De-/Serialisieren.

Geht mit der xsd.exe

zuerst aus der XML datei eine XSD Datei erzeugen und dann aus der XSD eine Klasse.

geht seit 1.1 , hier der link

Das einzige was du noch nachbearbeiten kannst sind die Element und Klassennamen, die sind manchmal nicht so gut, aber renamen geht ja dank "strg+r+r" flott

Wenn du das XML in eine Klasse umwandelst,musst dich nicht mit Linq rumschlagen, was aber interessant ist (und der mehraufwand an ressourcen ist normalerwiese vernachlaessigbar, da es leichter lesbar ist als z.B. durch die Nodes zu springen und linq kannst auch an anderer stelle verwenden), hast aber die Arbeit mit dem Umbennenen was jedoch schnell geschehen ist...

Selber durch die Nodes "huepfen" wuerde ich nicht mehr tun (weil sehr fehleranfaellig), ausser es kann sich eben die Struktur aendern (z.B. Attribut a, nicht immer an der "selben" stelle, sondern kann seine position innerhalb der XML struktur variieren)
 
Zuletzt bearbeitet:
@nApfelkuchen+SL

GENAU so was habe ich gesucht :D Vielen Dank. Hab vor langer Zeit mal mit C# gearbeitet, aber auch nur für ein jahr, hatte jetzt ein riessen durcheinander. die meisten Möglichkeiten, die hier gezeigt wurden hab ich im Inet gefunden, aber mit keiner funktionierte es wirklich, bzw. habe ich es wirklich zum laufen gebracht :(

Serializable geht nicht, da es zuviele Elemente sind und vor allem die Struktur viel zu gross und nicht gleichmässig. Eine klasse dafür zu schreiben würde Tage dauern ;)

Am weitesten kam ich mit XMLDocument. Das einlesen funktionierte soweit auch, habe einfach durch die node iteriert. Aber die Anzeige der 15000 Daten habe ich nicht hinbekommen.

public void readChildNodes(XmlNode node)
{
foreach (XmlNode child in node.ChildNodes)
{
if (child.Value != null)
data.Add(child.Value);
if (child.Attributes != null)
{
if (child.Attributes.Count > 0)
{
foreach (XmlAttribute attribute in child.Attributes)
{
data.Add(attribute.Name);
attributes.Add(attribute.Value);
//data.Add(attribute.Name);
//data.Add(attribute.Value);
}
}
}
readChildNodes(child);
}
}

Ich hatte dann aber auch einige Namen etc. doppelt oder dreifach vorhanden und so sachen.

Hab mich jetzt 3 Tage mit dem rumgequält.

Das Ziel ist es, 2 solcher XML Dateien vergleichen zu können, nebeneinander darzustellen und aufgrund eines masterfiles(so zu sagen einer Maske)(auch XML basierend) zu sagen, welche Elemente/Attribute abweichen dürfen.

Jetzt kann mich endlich an die eigentliche aufgabe ranmachen. Mal schauen ob ich das noch hinbekomme :D

ein dankeschön an euch alle

greez
 

Ähnliche Themen

Zurück
Oben