Entwickler-Ecke

IO, XML und Registry - foreach-Schleife bei XML-Datei Auslesen wird ignoriert


Eagle92 - Mo 11.07.11 13:41
Titel: foreach-Schleife bei XML-Datei Auslesen wird ignoriert
Hallo liebe Mitglieder,

folgendes problem bietet sich mir. Beim Versuch eine XML-Datei auszulesen wird meine foreach schleife ignoriert vielleicht weiß jemand um Rat würd mich freuen.

Die XML Datei sieht wie folgt aus:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
<?xml version="1.0" encoding="utf-8"?>

<Autos>
  <auto>
    <name>BMW 316 I Kompakt</name>
    <kennzeichen>LIP PH 73</kennzeichen>
    <ps>96</ps>
    <Farbe>Schwarz</Farbe>
  </auto>
  
  <auto>
    <name>Toyota Supra</name>
    <kennzeichen>LIP KJ 109</kennzeichen>
    <ps>170</ps>
    <Farbe>Silber Metallic</Farbe>
  </auto>
  
  <auto>
    <name>Mazda RX-7</name>
    <kennzeichen>ST Q 9</kennzeichen>
    <ps>230</ps>
    <Farbe>Dunkel Blau</Farbe>
  </auto>
</Autos>


und diesen Programmier Code verwende ich:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public void Auslesen()
        {
           
            XElement rootElement = XElement.Load(@"C:\\Praktikum_20_06_2011\\Parser_Xml\\Parser_Xml\\Autos_XML.xml");
               
                foreach (var productElement in rootElement.Elements("Autos"))
                {
                    Console.WriteLine(productElement.Attribute("auto").Value);
                    Console.WriteLine("Name: " + productElement.Element("name").Value);                  
                    Console.WriteLine();
                }
            
        }


Mit freundlichen Grüßen

Patrick

Moderiert von user profile iconTh69: Titel geändert.
Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Mo 11.07.2011 um 14:26
Moderiert von user profile iconChristian S.: C#- durch XML-Tags ersetzt


dark-destination1988 - Mo 11.07.11 13:50

schonmal durchdebuggt? geht er gar nicht erst rein? sind elemente vorhanden?


Trashkid2000 - Mo 11.07.11 13:52

Hallo,
Dein Rootelement ist "Autos", und darin sind andere "auto"-Elemente enthalten.
Also müsstest Du nur vom Rootelement die "auto"-Elemente durchgehen.

C#-Quelltext
1:
2:
3:
4:
foreach (var productElement in rootElement.Elements("auto"))
{
   //...
}

LG


Eagle92 - Mo 11.07.11 13:59

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
Dein Rootelement ist "Autos", und darin sind andere "auto"-Elemente enthalten.
Also müsstest Du nur vom Rootelement die "auto"-Elemente durchgehen.

C#-Quelltext
1:
2:
3:
4:
foreach (var productElement in rootElement.Elements("auto"))
{
   //...
}

LG


Dankeschön, hätte ich selber drauf kommen können. :-)


Eagle92 - Di 12.07.11 15:28

Eine Neue frage bietet sich mir nun,

Ich habe mitlerweile verschiedenes richtung Ausgabe der Nodes von XML Datein ausprobiert und mich dazu entschieden folgendes an zu wenden:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
  try
            {
                XElement rootElement = XElement.Load(config.Getpath);

                // Bereich der "Outputs" wird gewählt.

                    foreach (var productElement in rootElement.Elements("Outputs"))
                    {

                        // Ausgabe der Outputs.

                        Console.WriteLine(rootElement.Element("Outputs").Value);
                    }
                
                data.TypCalculation(rootElement);
            }
            catch (Exception)
            {
                Console.WriteLine("Fehlerhafte angaben");
            }


Mit dieser Methode steht mir die möglichkeit offen die Inputs und Outputs von einander zu trennen und dann in eine Liste zu sichern um sie dann aus zu geben,
allerdings erscheint die Ausgabe in einer Zeile, was wiederrum nicht sehr vorteilhaft für weitere Anwender dieses Programmes ist, ab eine bestimmte Anzahl von Daten ist der Überblick verloren.
Desweiteren habe ich in meiner XML-Datei Instanzen gesetzt mit denen ich gern die Daten mit einer Leerzeile von einander Trennen würde.

Jeweils bei den einzelnen Attributen sollte auch ein Zeilenumbruch stattfinden.

Vielleicht weiß ja jemand um Rat und könnte mir bei diesem Problem helfen.

Hier die neue XML-Datei mit der Struktur die als Standardt gilt für weiteren gebrauch des Projekts.:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
<?xml version="1.0" encoding="utf-8"?>

<XML Beschreibungsdatei="Fuer_ein_Modul">

<ModuleName>Modul_1</ModuleName>
<Gruppenname>Gruppe_1</Gruppenname>

    <Outputs>
      <Instanz1>
        <VariableName>Variable_1</VariableName>
        <VariableType>double</VariableType>
        <InitialValue>15.2</InitialValue>

        <VariableName>Variable_2</VariableName>
        <VariableType>int</VariableType>
        <InitialValue>306</InitialValue>
      </Instanz1>

      <Instanz2>
        <VariableName>Variable_3</VariableName>
        <VariableType>long</VariableType>
        <InitialValue>54418</InitialValue>
      </Instanz2>
    </Outputs>    
        
    <Input>
      <Instanz3>
        <VariableName>Variable_4</VariableName>
        <VariableType>double</VariableType>
                    
        <VariableName>Variable_5</VariableName>
        <VariableType>int</VariableType>
      </Instanz3>


      <Instanz4>
        <VariableName>Variable_6</VariableName>
        <VariableType>long</VariableType>
      </Instanz4>
    </Input>

 
</XML>


Erneut wäre ich euch sehr dankbar für weitere Hilfe,

Mit freundlichen Grüßen

Patrick


Trashkid2000 - Di 12.07.11 15:47

Hallo,
bitte erstelle für jede neue Frage einen neuen Thread, da es ansonsten sehr schwer ist, duchzusehen.
Zu dem Problem: So schwer ist es doch garnicht. Du musst Dich doch bloß von Knoten zu Knoten durcharbeiten.
Also z.B. so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
foreach (var productElement in rootElement.Elements("Outputs"))
{
  foreach (var instanceNode in productElement.Elements())
  {
    Console.WriteLine(instanceNode.Name);
    foreach (var variableNode in instanceNode.Elements())
    {
      Console.WriteLine(string.Format("{0}: {1}", variableNode.Name, variableNode.Value));        
    }
  }
}

LG


Eagle92 - Di 12.07.11 15:51

Danke für die schnelle Antwort, genauso sollte das aussehen und ich werde dein Rat beherzigen und beim nächsten mal einen Neuen Thread eröffnen.

Mit freundlich Grüßen

Patrick