Autor Beitrag
Wostl
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 15.10.11 14:00 
Hallo an alle,

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

Ich habe folgende XML-Datenbank:

ausblenden 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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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??

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
xdoc.Descendants("//Daten");					

Die "//" stehen für "Suchen auf allen Ebenen", s.a. 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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.