XML und C# .NET

hallo Leute,

ich hab ne 250k XML-Datei mit folgender Stuktur:

<?xml version="1.0" encoding="ISO8859-1" ?>132910122007ganz wichtigSoftwareV1.112345

...

Nun möchte ich gern mit C# Informationen aus dieser Datei auslesen und weiterbenutzen. Die Quellen widersprechen sich und den Ansatz in der msdn http://support.microsoft.com/kb/307548/de finde ich sinnlos. Ich will nicht die Datei durchlaufen und dann reader.Name vergleichen. Zumal das Beispiel nur 1 Untertsufe (heißt das so?) hat, meine Datei ist aber 3 Stufen.

Ich dachte mir sowas, wie

  1. einlesen
  2. einzelne Infos abfragen
  3. auswerten.

Eben der Zugriff wie auf eine Datenbank, wo ich konkrete Daten abfragen kann. Wie gehe ich denn da vor? Über XMLDocument und XML Serialisierung bin ich auch gestolpert, aber so richtig das was ich will ist es nicht, oder ich blicke es nicht.

Danke, Günther

Hallo Günther,

wenn ich dich recht verstehe, willst du „gezielt“ Daten (eigentlich Knoten mit Daten?) suchen. Dazu verwendet man unter c# (zumindest ich :wink:) folgende Methoden:

//Tippfehler seien mir verziehen!
XmlDocument doc = new XmlDocument();
XmlNode node;
String xPathAusdruck = "//tag"
doc.Load("");
//oder sonstwie die Daten in das XMLDocument laden
//erster Node der passt
node = doc.SelectSingleNode(xPathAusdruck); 
//alle Nodes die passen zb für eine Schleife
ForEach (XmlNode node in doc.SelectNodes(xPathAusdruck))

Dabei ist xPathAusdruck die „Suchmaske“. In dem Beispiel: Gib mir alle Tags mit dem Namen „tag“, egal in welcher Ebene die stehen. Schau dich dazu ggfs. mal bei SelfHTML um.

Natürlich kann man per c# auch Knoten oder Attribute ändern, löschen etc.

mfg

Dirk.Pegasus

hallo günther,

du hast leider nicht geschrieben, was du aus deinem eingabe-xml-doc herausbekommen willst. ich löse solche probleme lieber über xslt-s. das ist selber wieder xml, wird auf dein eingabe-xml-doc ‚angewandt‘ und holt über ‚matches‘ (zb. auf das xml-element ‚filetime‘) und über zb. xPath-ausdrücke bestimmte werte heraus (zb. select="./Hour"). diese werte kann man dann weiterverwenden um ein neues - womöglich besser passendes xml zu generieren, auch logische verknüpfungen a la „if ((./Hour) > 10) then ‚groesser zehn!‘ else ‚kleiner‘“ ist möglich.

ich gehe davon aus, dass du xml/xslt nicht kennst…da rate ich dir es nur zu verwenden, wenn sich die daten, die du willst nicht allzu komplex aus deinem eingabe-xml-doc ermitteln lassen. dann ists mit wenig-zeiligem xslt getan…und du kannst weiter unten im zugehörigen brett fragen :wink:

hth,

stefan

Hi Leute,

Hab ne prima Lösung gefunden. Ich mache jetzt einfach folgendes:

OpenFileDialog dlgFileOpen = new OpenFileDialog();
dlgFileOpen.Title = "Ordner mit XML-Dateien öffnen...";
dlgFileOpen.Filter = "XML-Dateien (\*.XML)|\*.XML";
dlgFileOpen.Multiselect = true;

XPathNodeIterator nodeItor;
string newname;

if (dlgFileOpen.ShowDialog() == DialogResult.OK)
{
 foreach (string Filename in dlgFileOpen.FileNames)
 {

 FileStream fs = new FileStream(Filename, FileMode.Open, FileAccess.Read);
 XmlTextReader reader = new XmlTextReader(fs);

 XPathDocument xpDocument = new XPathDocument(reader);
 XPathNavigator nav = xpDocument.CreateNavigator();

 nodeItor = nav.Select("/meinXML/Filetime/Hour");
 if (nodeItor.MoveNext())
 {
 MessageBox.Show(nodeItor.Current.Value.ToString());
 }
 fs.Close();
 }
}

Das mache ich dann für jeden Wert, der mich interessiert. Das funktioniert jetzt. Vielleicht könnt ihr mal drüberschauen und nochmal was dazu sagen, wäre mir lieb. Ist meine erste c# und generell objektorientierte Anwendung.

Danke,

Günther