Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Datenbank auslesen und mit if-Anweisung weiterarbeiten


Wostl - Sa 15.10.11 14:00
Titel: Datenbank auslesen und mit if-Anweisung weiterarbeiten
Hallo an alle,

ich suche schon seit längerem, habe aber leider noch nichts passendes gefunden...

Ich habe folgende XML-Datenbank:


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:
25:
26:
<?xml version="1.0" encoding="utf-8" ?>

<Ort1>
      <Nachname Nachname="Sirname">
            <Daten Vorname="Forename" Mobilnummer="4917xxxxxxxx" Schleife26048="48True" Schleife26049="49True" Schleife26084="84False" Schleife26086="86False" Führungsdienstgrad="False" Maschinist="False" Atemschutzgeräteträger="True" Absturzsicherung="True" UGÖEL="UGFalse" Jugend="False"/>
      </Nachname>
      <Nachname Nachname="Sirname2">
            <Daten Vorname="Forename2" Mobilnummer="4917xxxxxxxx1" Schleife26048="48True" Schleife26049="49True" Schleife26084="84True" Schleife26086="86True" Führungsdienstgrad="False" Maschinist="False" Atemschutzgeräteträger="True" Absturzsicherung="True" UGÖEL="UGTrue" Jugend="False"/>
      </Nachname>
</Ort1>
<Ort2>
      <Nachname Nachname="Sirname">
            <Daten Vorname="Forename" Mobilnummer="4917xxxxxxxx" Schleife26024="24True"/>
      </Nachname>
      <Nachname Nachname="Sirname2">
            <Daten Vorname="Forename2" Mobilnummer="4917xxxxxxxx1" Schleife26024="24True"/>
      </Nachname>
</Ort2>
<Ort3>
      <Nachname Nachname="Sirname">
            <Daten Vorname="Forename" Mobilnummer="4917xxxxxxxx" UGÖEL="UGTrue"/>
      </Nachname>
      <Nachname Nachname="Sirname2">
            <Daten Vorname="Forename2" Mobilnummer="4917xxxxxxxx1" UGÖEL="UGTrue"/>
      </Nachname>
</Ort3>


Diese würde ich gerne nach bestimmten Einträgen im Knoten "Daten" abfragen, wenn diese Bedingung wahr ist, soll er mir die Mobilnummer zurückgeben.

Bei meinen bisherigen Versuchen habe ich allerdings entweder im alle Mobilnummern bekommen oder gar keine.
Hier ist mein letzter Versuch:


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:
namespace XML26048
{
    class Program
    {
        static void Main(string[] args)
        {
            //Lesen der Datei
            XmlTextReader rdr = new XmlTextReader("C:\\Users\\Sebastian\\Documents\\Visual Studio 2010\\Projects\\DatenbankFFW\\DatenbankFFW\\Datenbank.xml");

            while (rdr.Read())
            {
                if(rdr.MoveToContent() == XmlNodeType.Element)
                {
                    try
                    {
                        XDocument xdoc = XDocument.Load("C:\\Users\\Sebastian\\Documents\\Visual Studio 2010\\Projects\\DatenbankFFW\\DatenbankFFW\\Datenbank.xml");

                        var query = from c in xdoc.Descendants("Daten").Attributes("Schleife26084")
                                    select c.Value;

                        foreach (var item in query)
                        {
                            if (item == "84True")
                                    //Console.WriteLine(c.Attribute("Mobilnummer").Value);
                                    Console.WriteLine("Mobilnummer = {0}", rdr.ReadElementString("Mobilnummer"));
                                    //Console.WriteLine("Nachname = {0}", rdr.ReadElementString("Nachname");
                        }
                    }
                    catch(XmlException)
                    {
                        //ignorieren ... 
                    }
                }
            }
            rdr.Close();

            Console.ReadLine();
        }
    }
}


Kann mir hier wer weiterhelfen??


Beste Grüße

Wostl


Th69 - Sa 15.10.11 14:14

Hall und :welcome:

durch die Methode 'Attributes("Schleife26084")' kriegst du nur den Inhalt dieses Attributes wieder, d.h. du bist eine Ebene zu tief.
Probiere mal:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var query = from c in xdoc.Descendants("Daten")
            select c;

foreach (var item in query)
{
    var attr = item.Attribute("Schleife26084");
    if (attr != null)
    {
       if (attr.Value == "84True")
       {
         var attr2 = item.Attribute("Mobilnummer");
         if (attr2 != null)
         {
            Console.Write(attr2.Value);
         }
       }
    }
}

Die Abfrage auf null ist, falls es dieses Attribut nicht gibt (um somit eine NulLReferenceException zu vermeiden).


Wostl - Sa 15.10.11 14:24

Merce für die schnelle Antwort.

Mit folgender Abfrage bekomme ich das gewünschte Ergebnis. Allerdings 5-mal.
Kann das an meiner "äußeren" Schleife liegen??


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
                        var query = from c in xdoc.Descendants("Daten")
                                    select c;

                        foreach (var item in query)
                        {
                            var attr = item.Attribute("Schleife26084");
                            if (attr != null && attr.Value=="84True")
                            {
                                var attr2 = item.Attribute("Mobilnummer");
                                if (attr2 != null)
                                {
                                    Console.Write(attr2.Value);
                                }
                            }
                        }


Wostl - Sa 15.10.11 14:57

Die Wiederholung lag wirklich an meiner äußeren Schleife.
Dieses Problem ist also gelöst.

Aber da wäre ein neues:
Wenn ich nur einen Oberknoten <Ort1></Ort1> habe, funktioniert das Programm tadellos.
Füge ich allerdings den Knoten <Ort2></Ort2> ein, funktioniert es wieder nicht mehr...
(Es liefert nichts zurück)

Weiß hier irgendwer mit guten Ideen zu glänzen?? ;)


Th69 - Sa 15.10.11 16:12

Hallo Wostl,

warum benutzt du überhaupt Indizes bei den Orten? In XML ist es ja üblich, einfach einen gleichbleibenden Knotennamen (z.B. <Ort>) zu benutzen (machst du ja bei den Unterknoten <Nachname> auch so).

Ansonsten probiere mal:

C#-Quelltext
1:
xdoc.Descendants("//Daten");                    

Die "//" stehen für "Suchen auf allen Ebenen", s.a. http://de.wikipedia.org/wiki/XPath

P.S: Das mit deinem mehrfachen Einlesen (XmlTextReader und XDocument) war mir auch gar nicht aufgefallen (hatte nur auf die Attribute geschaut ;-))


Kha - Sa 15.10.11 17:50

user profile iconWostl hat folgendes geschrieben Zum zitierten Posting springen:
füge ich allerdings den Knoten <Ort2></Ort2> ein
...solltest du eine XmlException erhalten, da wohlgeformtes XML immer genau einen Root-Knoten haben muss.


Wostl - So 16.10.11 16:10

@Kha:
Diese Exception bekomme ich nicht, da ich sie abgefangen habe^^

@Th69
Die Indizes hatte ich, da ich selber noch nicht genau wusste, wie ich das Problem löse...
Werde nun allerdings für jeden Ort eigene XML´s machen, somit hat sich das Problem gelöst.