Laden...

XML Datei auslesen und Output formatieren

Erstellt von Andybritten vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.870 Views
A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 15 Jahren
XML Datei auslesen und Output formatieren

Hallo Leute!

Ich bin ziemlich neu in der C#-Scene und hatte vorher auch nicht viel programmiert also bitte nicht anschreien wegen schlechten Codes.

Mein kleines Problem.
Ich les eine XML Datei mit dem folgenden Befehl aus:

StreamReader read = new StreamReader(Path + "\\test.xml");
                            while ((line = read.ReadLine()) != null)
                            {
                                if (line.Contains("Test"))
                                {
                                    Test += line + "\n";
                                }
                                if (line.Contains("This"))
                                {
                                    This += line + "\n";
                                }
                                if (line.Contains("Here"))
                                {
                                    Here += line + "\n";
                                }

                            }
                            read.Close();

Der Output ist dann wie folgt:

 output = Test + This + Here 
console.write(output)
        <Test>asdasdasd1</Test>  
        <Test>asdasdasd2</Test>  
        <Test>asdasdasd3</Test>  
        <This>blubblub1</This>  
        <This>blubblub2</This>  
        <This>blubblub3</This>  
        <Here>ahaha1</Here>  
        <Here>ahaha2</Here>  
        <Here>ahaha3</Here>

Nun zu meiner Frage.

Kann ich das irgendwie schreiben dass ersten der output sortiert ist und die "<Test>","<This>" und "<Here>" Kästchen weg sind?
Also etwa so:

       Test: asdasdasd1  
       This: ahaha1  
      Here:  blubblub1  
      Test:  asdasdasd2  
      This:  blubblub2  
        ahaha2  
      Test:  asdasdasd3  
      This:  blubblub3  
      Here:  ahaha3

Vielen Dank schonmal für die Hilfe 😃

239 Beiträge seit 2008
vor 15 Jahren

Hallo Andybritten,

das ist natürlich möglich. Für das Auslesen einer XML-Datei ist allerdings die StreamReader-Klasse am wenigsten geeignet 😉 Stattdessen solltest du dir den Namespace System.Xml ansehen. Dort gibt es z.B. die Klasse XmlDocument, es gibt einen XmlReader, mit denen du die XML-Datei komfortabler auslesen kannst und auch besser ausgeben kannst.

Eine weitere Möglichkeit (ab Framework-Version 3.0) wäre Linq 2 XML.

Am besten siehst du dir hierfür die Doku an, die auch gute Beispiele bietet.

Gruß Michbeck1983

Neulich im Computerkurs:
Mein Computer kennt Else nicht! 😁


[URL]XING-Profil[/URL]

A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 15 Jahren

Ok habs soweit jetzt mal en bisschen nachgegoogelt und folgendes gemacht:

System.Xml.XmlDocument document = new System.Xml.XmlDocument();
                            document.Load(@Path + "\\sitemanager.xml");

                            System.Xml.XmlNode node = document.SelectSingleNode ("FileZilla3").SelectSingleNode ("Servers").SelectSingleNode ("Server");
                            if (node != null)
                            {
                                    string name = node.SelectSingleNode("Host").InnerText;
                                    string user = node.SelectSingleNode("User").InnerText;
                                    string port = node.SelectSingleNode("Port").InnerText;
                                    Console.Write(name);
                                    Console.Write(user);
                                    Console.Write(port);
                            }

Jetzt zu meinem nächsten kleinen Problem.
Es gibt mehrere nodes mit dem namen "Server".
Im moment liest er nur den ersten Node aus.
Wie kann ich das machen dass ich zum nächsten Node "Server" weiterspring und da dann wieder diese werte ausles?

239 Beiträge seit 2008
vor 15 Jahren

Hallo Andybritten,

lies die Werte innerhalb einer Schleife aus. Beispiel:


XmlDocument doc = new XmlDocument();
doc.LoadXml("deineXmlDatei.xml");

XmlNode root = doc.FirstChild;

if (root.HasChildNodes)
{
  for (int i = 0;i < root.ChildNodes.Count; i++)
  {
      Console.WriteLine(root.ChildNodes[i].InnerText);
  }
}

Gruß Michbeck1983

Neulich im Computerkurs:
Mein Computer kennt Else nicht! 😁


[URL]XING-Profil[/URL]

3.003 Beiträge seit 2006
vor 15 Jahren

Sicherlich nicht die beste Methode. Denk weniger als Navigation von einem XML-File (also: geh zu diesem Knoten, dann das zweite Kind, dessen erstes Kind, und dann dessen Geschwister), sondern als Direktauswahl (also: "Wähle alle Knoten, die Server heissen und das Attribut "id" mit einem Wert von 5 oder größer haben").

Stichworte sind XmlDocument, insbesondere XmlDocument.SelectNodes(). Dazu benötigst du Kenntnisse über XPath.


XmlDocument document = new System.Xml.XmlDocument();
document.Load(@Path + "\\sitemanager.xml");

foreach (XmlNode serverNode in doc.DocumentElement.SelectNodes("Servers/Server"))
{
  string name = serverNode.SelectSingleNode("Host").FirstChild.Value;
  string user = serverNode.SelectSingleNode("User").FirstChild.Value;
  string port = serverNode.SelectSingleNode("Port").FirstChild.Value;
  Console.WriteLine("{0} - {1} - {2}", name, user, port);
}

LaTino
EDIT: und gewöhn dir ab, InnerText oder InnerXml zu verwenden 😃

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 15 Jahren

Tausend Dank Leute 😃

Ihr seit echt spitze 😃

EDIT:
Letztes kleines Problem.


                                Console.WriteLine("{0} {1} {2}", "Host: " + name + "\n", "User: " + user + "\n", "Port: " + port + "\n");
                                logoutput = ""Host: " + name + "\n" + "User: " + user + "\n" + "Port: " + port + "\n";

Der Konsolen Output ist richtig.
Alle node "Server" werden ausgelesen und auch richtig angeordnet.
Nur wenn ichs dann versuch als string zu speichern kommt wieder nur der LETZTE node raus.
Ist bestimmt weil das halt die letzten Werte der strings name,user,port ausliest und sost keine anderen vorhanden sind.

Gibts eine bessere Methode diese Informationen zu speichern damit ich alle Daten nachher als String abrufen kann?

3.003 Beiträge seit 2006
vor 15 Jahren
Console.WriteLine("{0} {1} {2}", "Host: " + name + "\n", "User: " + user + "\n", "Port: " + port + "\n");  
  

Was zum Teufel...
Bitte Console.Write(String, Object[]) lesen und verstehen.


Console.WriteLine("Host: {0}, User: {1}, Port: {2}", name, user, port);

Alle node "Server" werden ausgelesen und auch richtig angeordnet.
Nur wenn ichs dann versuch als string zu speichern kommt wieder nur der LETZTE node raus.

Ist bestimmt weil das halt die letzten Werte der strings name,user,port ausliest und sost keine anderen vorhanden sind.

Nein, sondern weil du in einer Schleife in jedem Durchgang die Variablen neu füllst, und damit die alten Werte wegwirfst. Du solltest die schon speichern, beispielsweise in einer Liste.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 15 Jahren

Naja....
Tut mir leid wenn ich dich belästige...
Wie gesagt bin neu in C#.

Ich hatte das eingetlich so vor:

Daten auslesen -> Speichern also String -> String in eine Textdatei Speichern -> Fertig
Das scheint ja nicht zu klappen.
Gehts vielleicht so:
Daten auslesen -> GLEICH IN TEXTDATEI speichern -> Fertig
Ohne List???

Damit ich halt in der Textdatei am ende das selbe schöne ergebnis hab wie in der console 😃

3.003 Beiträge seit 2006
vor 15 Jahren

Naja....
Gehts vielleicht so:
Daten auslesen -> GLEICH IN TEXTDATEI speichern -> Fertig
Ohne List???

Hast du es so ausprobiert? Welche Probleme hattest du dabei?
[Hinweis] Wie poste ich richtig?

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 15 Jahren

Tja das Problem ist ich weiß nicht wie man die Daten direkt in eine Textdatei speichert.
Habs bis jetzt immer nur über strings gemacht die dann ein StreamWriter in ne Textdatei gespeichert hat.

Jo... Ich hab ja die Regeln gelesen...
Tut mir leid. Ich stell am besten keine Fragen mehr...

3.003 Beiträge seit 2006
vor 15 Jahren

Tja das Problem ist ich weiß nicht wie man die Daten direkt in eine Textdatei speichert. Dann such danach.
Tut mir leid. Ich stell am besten keine Fragen mehr...

In der geposteten F.A.Q. steht genau, wie du posten musst, um sinnvolle Antworten zu erhalten. Ist natürlich deine Entscheidung, das auch mal zu lesen.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 15 Jahren

Ich bin dir sehr dankbar für deine Hilfe aber deine unnützen Kommentare gehen mir trotzdem aufn Sack. Schon der Ton in deiner PN.
Wenn du mir nicht helfen willst dann lass es einfach bleiben.

Wenn du meinen Post gelesen hättest wüsstest du übrigends auch, dass ich das FAQ gelesen hab.

EDIT:
Und über StreamWrite geht der Scheiss auch net.
Das hatte ich nämlich schon probiert.
Auch nur eine Zeile.

3.003 Beiträge seit 2006
vor 15 Jahren

Und über StreamWrite geht der Scheiss auch net.
Das hatte ich nämlich schon probiert.
Auch nur eine Zeile.

Nicht, wenn du in jedem Durchgang der Schleife beim Auslesen der Server-Knoten je eine Zeile in deine Datei schreibst.

Ich bin dir sehr dankbar für deine Hilfe aber deine unnützen Kommentare gehen mir trotzdem aufn Sack. Schon der Ton in deiner PN.
Wenn du mir nicht helfen willst dann lass es einfach bleiben.

Wundervoll. Ich bin derjenige, der von dir über jeden Update im Thread hier per PN benachrichtigt wird, aber du bist der Genervte. Gratuliere. Dann werde ich dir mal nicht weiter "auf den Sack gehen".

LaTino, eot für mich

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 15 Jahren

Ich war ganz nett zu dir und hab nix böses zu dir gesagt.
Komm ist jetzt egal.
Das thema ist für mich gegessen.

Ich hab übrigends raus wies jetzt geht.
Hättest auch einfach sagen können dass ich einfach ein "+=" mach muss -.-
Wär das so schwer gewesen?

So kann geschlossen werden.

Nochmals Danke an alle die mir geholfen haben!

C
101 Beiträge seit 2008
vor 15 Jahren

Hey Leuts

Was ihr da geschrieben habt funktioniert sicherlich aber um Daten aus einer XML-Datei zu verarbeiten, eignet sich meiner Meinung nach XSLT am besten.
Es ist relativ einfach und man hat sich schnell eingearbeitet.

Doch vorsicht: Komplexe Strukturen (wie etwa doppelte foreach-Schlaufen) können nicht generiert werden.

Probierts doch mal aus

3.003 Beiträge seit 2006
vor 15 Jahren

Was ihr da geschrieben habt funktioniert sicherlich aber um Daten aus einer XML-Datei zu verarbeiten, eignet sich meiner Meinung nach XSLT am besten.

XSLT eignet sich, um die Daten zu transformieren, nicht, um sie zu verarbeiten. Allerdings war das im Grunde das, was er vor hatte, sofern ist der Tipp nicht schlecht.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)