tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
18
ZUGRIFFE
937
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Hallo,
    ich habe folgende Code von C# in VB.NET übernommen. Erhalte jedoch in der Zeile mit dem STringvergleich einen Fehler, dass der Objektverweis nicht auf eine Objektinstanz festgelegt wurde.

    Code :
    1
    2
    3
    4
    5
    6
    
                Dim queryVariable = From item In XDoc.Descendants("Apartment").Descendants("Variable").Attributes("TypeID") _
                                    Select New With { _
                                        .Typnummer = item.Value, _
                                        .Datentyp = (From element In XDoc.Descendants("Apartment").Descendants("Type") _
                                                        Where element.Attribute("TypeID").Value.ToString = item.Value.ToString _
                                                        Select element.Value).First()}

    Der Code in C# funktioniert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
                var queryVariable = from item in doc.Descendants("Apartment").Descendants("Variable").Attributes("TypeID")
                                    select new
                                    {
                                        Typnummer = item.Value,
                                        Datentyp = (from element in doc.Descendants("Apartment").Descendants("Type")
                                                    where (string) element.Attribute("TypeID") == (string)item.Value
                                                    select element.Value).First()
                                    };


    Weiß jmd. woran dies liegen könnte?

    Gruß
    Geändert von multitasker (31.03.10 um 11:40 Uhr)
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    In C# castest du nach string und in VB.NET konvertierst du nach Int32. Ich glaub da könnte der Hund begraben liegen.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Hallo Nico,
    sorry, habe mehrere Dinge versucht und beim Einstellen hier ins Forum nicht alles rückgängig gemacht.

    In dem Element element.Attribute("TypeID").Value befindet sich ein Integerwert. Deshalb habe ich danach noch per KOnvertierung versucht es zum Laufen bekommen.

    Die Zeile soll natürlich so aussehen und werde es gleich ändern im ersten Posting (falls es geht). Bei dem Code hätte ja auch der Compiler sich beschwert.

    Code :
    1
    
    Where element.Attribute("TypeID").Value.ToString = item.Value.ToString _
    Geändert von multitasker (31.03.10 um 11:41 Uhr)
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Wie sieht denn dein Dokument aus.

    Ich hab deine Abfragen mal schnell mit LINQPad ausprobiert und die gleichen Ergebnisse bekommen.

    Vermutlich gibt es ein Type Element welches keine TypeID besitzt?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Es handelt sich um eine XML Datei. Kann ich diese auch mit LinqPad abfragen?

    Ich habe die Datei mal hier abgelegt:

    http://rapidshare.com/files/37032276...enten.XML.html

    Das komische ist für mich, dass es mit C# funktioniert.
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von multitasker Beitrag anzeigen
    Es handelt sich um eine XML Datei. Kann ich diese auch mit LinqPad abfragen?
    Natürlich.
    Code vbnet:
    1
    2
    
    Dim doc = XDocument.Load("c:\pfad\zur\datei\1_Bild_mit_2_Elementen.XML")
    doc.Dump("XDocument")
    Zitat Zitat von multitasker Beitrag anzeigen
    http://rapidshare.com/files/37032276...enten.XML.html

    Das komische ist für mich, dass es mit C# funktioniert.
    Wie bereits vermutet, die Ausgabe von
    Code csharp:
    1
    2
    
    var q = from i in doc.Descendants("Apartment").Descendants("Type") select i.Attribute("TypeID");
        q.Dump("q");
    ist für das fragliche XML:
    Code :
    1
    2
    
    null  
    TypeID="6"
    D.h. es gibt ein Type Element welches kein TypeID Attribut enthält.

    Wenn du den VB.NET Code so änderst:
    Code vbnet:
    1
    
    where element.Attribute("TypeID") = item.Value
    dann bekommst du das gleiche Ergebnis wie bei C#.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Ich habe es so versanden:

    Code :
    1
    2
    3
    4
    5
    6
    
                Dim queryVariable = From item In XDoc.Descendants("Apartment").Descendants("Variable").Attributes("TypeID") _
                                    Select New With { _
                                        .Typnummer = item.Value, _
                                        .Datentyp = (From element In XDoc.Descendants("Apartment").Descendants("Type") _
                                                        Where element.Attribute("TypeID") = item.Value _
                                                        Select element.Value).First()}

    jedoch bekomme ich so natürlich schon beim Kompilieren die Meldung, dass XElement nicht in STring konvertiert werden kann.
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von multitasker Beitrag anzeigen
    Ich habe es so versanden:

    Code :
    1
    2
    3
    4
    5
    6
    
                Dim queryVariable = From item In XDoc.Descendants("Apartment").Descendants("Variable").Attributes("TypeID") _
                                    Select New With { _
                                        .Typnummer = item.Value, _
                                        .Datentyp = (From element In XDoc.Descendants("Apartment").Descendants("Type") _
                                                        Where element.Attribute("TypeID") = item.Value _
                                                        Select element.Value).First()}

    jedoch bekomme ich so natürlich schon beim Kompilieren die Meldung, dass XElement nicht in STring konvertiert werden kann.
    OK. Am saubersten wäre es sowieso den Fehlerfall abzufangen:
    Code vbnet:
    1
    2
    3
    
    From element In XDoc.Descendants("Apartment").Descendants("Type") _
        Let type = element.Attribute("TypeID") _
        Where type IsNot Nothing and type.Value = item.Value
    Gruß

    \edit: Noch schöner ist es vermutlich mit einem join:
    Code vbnet:
    1
    2
    3
    4
    5
    6
    7
    
    From item _
    In XDoc.Descendants("Apartment").Descendants("Variable").Attributes("TypeID") _
    join e _
    in XDoc.Descendants("Apartment").Descendants("Type") _
           .Where(Function(e) e.Attribute("TypeID") isNot Nothing) _
    on e.Attribute("TypeID").Value equals item.Value _
    select new with { .Typnummer = item.Value, .Datentyp = e.Value }
    Geändert von deepthroat (31.03.10 um 17:10 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Danke für deine tatreiche Unterstütung. Leider funktioniert es bei mir immer noch nicht. Weder im VS noch im LinqPad.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken LinqToXML Code läuft in C# aber nicht in VB.NET-fehlermeldung_linq.png   LinqToXML Code läuft in C# aber nicht in VB.NET-fehlermeldung_linq2.png  

     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von multitasker Beitrag anzeigen
    Danke für deine tatreiche Unterstütung. Leider funktioniert es bei mir immer noch nicht. Weder im VS noch im LinqPad.
    Das kann ich überhaupt nicht nachvollziehen. Ich hab jetzt nochmal ein VB.NET Projekt angelegt und es funktioniert einwandfrei.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Alles funktioniert immer nur solange bis was neues kommt.
    So,...
    Ich habe nun noch das Problem, dass es das Element "Text" selten aber manchmal nicht gibt.

    item2.Elements("Text")

    Ich dachte eigentlich es sei damit abgefangen, wenn ich dies in das Where Statement schreibe. Dem ist aber nicht so. Ich bekomme die Meldung:

    Bei der Auflistung wurde kein Ergebnis zurückgeliefert.

    Der unten aufgeführte Code ist in einer verschachtelten Abfrage.

    Code :
    1
    2
    3
    4
    5
    6
    7
    
     
    select new {
    ....
                                          TagName = (from item2 in item.Parent.Parent.Parent.Elements()
                                                     where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107" && item2.Elements("Text").Count() > 0
                                                     select item2.Elements("Text").Count() > 0 ? item2.Elements("Text").First().Value : string.Empty)
    }

    any ideas?
     

  12. #12
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Alles funktioniert immer nur solange bis was neues kommt.
    So,...
    Ich habe nun noch das Problem, dass es das Element "Text" selten aber manchmal nicht gibt.

    item2.Elements("Text")

    Ich dachte eigentlich es sei damit abgefangen, wenn ich dies in das Where Statement schreibe. Dem ist aber nicht so. Ich bekomme die Meldung:

    Bei der Auflistung wurde kein Ergebnis zurückgeliefert.

    Der unten aufgeführte Code ist in einer verschachtelten Abfrage.

    Code :
    1
    2
    3
    4
    5
    6
    7
    
     
    select new {
    ....
    TagName = (from item2 in item.Parent.Parent.Parent.Elements()
                          where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107" && item2.Elements("Text").Count() > 0
                          select item2.Elements("Text").Count() > 0 ? item2.Elements("Text").First().Value : string.Empty)
    }

    any ideas?
     

  13. #13
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Wenn du schon in der where Klausel die Elemente ausschließt, die kein Text Element haben, dann kann natürlich nichts mehr ausgewählt werden.

    Code csharp:
    1
    2
    3
    
    (from item2 in item.Parent.Parent.Parent.Elements()
           where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107" && item2.Elements("Text").Count() > 0
           select item2.Elements("Text").First().Value)  COALESCING_OPERATOR string.Empty
    Statt COALESCING_OPERATOR mußt du den "Verbindungsoperator" einsetzen. Leider erlaubt das Forum keine doppelten Fragezeichen...

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  14. #14
    multitasker multitasker ist offline Mitglied Silber
    Registriert seit
    Apr 2008
    Beiträge
    57
    Hallo deepthroat,
    ich bin übrigens auch deepthroat Fan.

    Gute Idee mit dem Operator. Das funktioniert auch, sodass ich keinen Fehler mehr bekommen. Ich denke, dass ich es aber ein wenig anders machen muss.

    Mal kurz zur Übersicht, vielleicht hast du dazu auch eine gute Idee.

    Im Moment ist TagName in einem neuene anonymen Datentyp. Das ist vorübergehend zum Testen so, damit ich sehe, was alles zurückkommt aus der Abfrage. Später ist es ein definierter Datentyp (Klasse) in der TagName ein String ist. Deshalb ist es notwendig, dass ich auch nur ein Ergebnis zurückbekomme. Falls mehrere zurückkommen, da es mehrere Elemente mit "Text" gibt, möchte ich eine entsprechende Meldung eintragen anstatt dem item2.Elements("Text").First().Value (was ja eigentlich mal item2.Element("Text").Value heißen müsste, wenn nur noch eines zurückkommt). Im Moment bekomme ich mehrere Texte zurück und wenn kein Text gefunden wurde oder mehrere bekomme ich mit dem unteren Code auch nicht den entsprechenden Eintrag. Sprich es geht noch gar nischts, bis auf das Kompilieren was fehlerfrei ist. Geht das mit Join und wenn ja nur mit Join?

    Code :
    1
    2
    3
    4
    5
    
    select new {
    TagName = (from item2 in item.Parent.Parent.Parent.Elements()
                            where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107"
                            select item2.Elements("Text") == null ? "Kein Text gefunden" : item2.Elements("Text").Count() > 1 ? "Zuviele Texte gefunden" : item2.Elements("Text").First().Value)
    }
     

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von multitasker Beitrag anzeigen
    Mal kurz zur Übersicht, vielleicht hast du dazu auch eine gute Idee.

    Im Moment ist TagName in einem neuene anonymen Datentyp. Das ist vorübergehend zum Testen so, damit ich sehe, was alles zurückkommt aus der Abfrage. Später ist es ein definierter Datentyp (Klasse) in der TagName ein String ist. Deshalb ist es notwendig, dass ich auch nur ein Ergebnis zurückbekomme. Falls mehrere zurückkommen, da es mehrere Elemente mit "Text" gibt, möchte ich eine entsprechende Meldung eintragen anstatt dem item2.Elements("Text").First().Value (was ja eigentlich mal item2.Element("Text").Value heißen müsste, wenn nur noch eines zurückkommt). Im Moment bekomme ich mehrere Texte zurück und wenn kein Text gefunden wurde oder mehrere bekomme ich mit dem unteren Code auch nicht den entsprechenden Eintrag.
    Ja, welchen Eintrag möchtest du denn auswählen wenn es mehrere Einträge gibt?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. PHP mit DB aber skript läuft nicht.
    Von ms-networker im Forum PHP
    Antworten: 5
    Letzter Beitrag: 19.07.07, 09:21
  2. Antworten: 10
    Letzter Beitrag: 23.08.05, 12:56
  3. VB code läuft aber berechnet die Werte nicht
    Von BWL80 im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 17.07.05, 18:15
  4. Navigation läuft im IE, NS6+7, Mozilla.... aber nicht im NS4
    Von chacharon im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 06.05.04, 20:22
  5. Site läuft im I-explorer, aber nicht in Netscape!?
    Von Exorix im Forum HTML & XHTML
    Antworten: 3
    Letzter Beitrag: 28.11.03, 18:34