Laden...

[gelöst] LINQ-Abfrage Problem mit Array

Erstellt von cordell vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.296 Views
C
cordell Themenstarter:in
63 Beiträge seit 2007
vor 14 Jahren
[gelöst] LINQ-Abfrage Problem mit Array

verwendetes Datenbanksystem: <LINQ to XML>

Servus,

ich habe folgendes Problem und zwar möchte ich aus einer XML-Datei Channels
auslesen, welche sich in einem Array befinden.

Das XML sieht so aus:


<member>
<name>channels</name>
<value>
<array>
<data>
<value>
<int>14</int>
</value>
<value>
<int>15</int>
</value>
<value>
<int>17</int>
</value>
<value>
<int>18</int>
</value>
<value>
<int>19</int>
</value>
<value>
<int>28</int>
</value>
</data>
</array>
</value>
</member>

Ich möchte also nun per LINQ-Query die INT-Werte (Channels) abfragen!

Mit der bisherigen Abfrage...


var channels = from c in xISDN.XPathSelectElements("//member[name='channels']")
                       where c.IsAfter(xISDN)
                       select c;

...bekomme ich als Value leider so etwas "channels141517181928"! Den String "channels"könnte ich mit SubString() abschneiden, aber bei den Zahlen sieht das leider etwas anders aus, da diese nicht immer 2-stellig sind und der String auch nicht immer gleich lang ist!

Ich möchte also quasi als Ergebnis der Linq-Query eine list oder array haben, wo
die Channelwerte einzeln drin stehen!

Bin für jeden Tipp dankbar!

unsere Feinde benutzen Ninjitsu, um den Weltfrieden zu stören!

C
116 Beiträge seit 2004
vor 14 Jahren

XDocument doc = XDocument.Load(@"test.xml");

var results = from element in doc.Element("member").Element("value").Element("array").Element("data").Elements()
select element.Element("int").Value;

So müsstest du auf jeden Fall die Ergebnisse bekommen. Spiel damit bisschen rum, evtl. passt du es für deine Fälle an.

C
cordell Themenstarter:in
63 Beiträge seit 2007
vor 14 Jahren

Hi Counterfeit,

schon mal danke für deine Antwort! 😃

Ich hab jedoch das Problem, dass in der XML-Datei, die ich parse zig member-tags drin sind! Ich habe nur den member "channels" brauche und von diesem die Werte. Der XML-Auschnitt aus meinem ersten Post ist nur ein kleiner Teil.

Nun wie kann ich denn den genau mit LINQ sagen dass ich die Werte unter diesem haben möchte.

Hatte es jetz mal so probiert:


var channels =  from x in xISDN.XPathSelectElements("//member[name='channels']")
                                where x.IsAfter(xISDN) 
                                from c in x.Element("member").Element("value").Element("array").Element("data").Elements()
                                select c.Element("int").Value;


da bekomme ich aber bei deiner Zeile ne NullReferenceException

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Soll ich die XML-Datei als Beispiel mal hochladen?

unsere Feinde benutzen Ninjitsu, um den Weltfrieden zu stören!

R
25 Beiträge seit 2009
vor 14 Jahren

Hallo lieber Cordell,

wie sieht es aus wenn du das Ergebnis von


var channels = from c in xISDN.XPathSelectElements("//member[name='channels']")
                       where c.IsAfter(xISDN)
                       select c;

mit einer foreach Schleife durchläufst?

C
116 Beiträge seit 2004
vor 14 Jahren
foreach (XElement item in channels)
{
     if (item.Element("name").Value == "channels")
     {
          //Reagier hier drauf
     }
}

Damit dürftest du garantiert das erreichen was du willst.

C
cordell Themenstarter:in
63 Beiträge seit 2007
vor 14 Jahren

Servus Riker,

es will nicht klappen, vielleicht stehe ich au grad aufm Schlauch. Bekomme immernoch ne Exception. Ist die Zuweisung bei channelint flasch?


var channels = from c in xISDN.XPathSelectElements("//member[name='channels']")
                               where c.IsAfter(xISDN)
                               select c;

                ISDN? actualISDN = getISDN(split);  //hol die aktuelle ISDN-Conf

                foreach (var ints in channels)
                {
                    if (ints.Element("name").Value == "channels")
                    {

                        var channelint = ints.Element("int").Value;
                        actualISDN.Value.channels.Add(channelint);
                    }

                }

unsere Feinde benutzen Ninjitsu, um den Weltfrieden zu stören!

R
25 Beiträge seit 2009
vor 14 Jahren

Also mit deinem XML Dokument von oben liegt das int Element nicht direkt unterhalb des Elements in dem du dich gerade befindest.


var channelint = ints.XPathSelectElements("value/array/data/value") müsste dir die XElement zurückgeben die als Value die Zahl halten.
C
cordell Themenstarter:in
63 Beiträge seit 2007
vor 14 Jahren

Es funktioniert! Danke für die Hilfe @Counterfeit und Riker81!!


foreach (var ints in channels)
                {
                    if (ints.Element("name").Value == "channels")
                    {
                        var channelint = ints.XPathSelectElements("value/array/data/value");
                        var chn = from wert in channelint
                                  select wert.Value;

                        foreach (var wert in chn)
                            actualISDN.Value.channels.Add(wert);
                    }

                }

unsere Feinde benutzen Ninjitsu, um den Weltfrieden zu stören!

C
cordell Themenstarter:in
63 Beiträge seit 2007
vor 14 Jahren

doppel Post! ups 😃

unsere Feinde benutzen Ninjitsu, um den Weltfrieden zu stören!