Feedback Report bleibt ohne Beachtung

Ich will ja nicht meckern, aber mein Report vom 3.8.2014 wurde noch nicht mal angeschaut.
Ein Fix ist hier sicherlich schnell erledigt und würde sicher jedem helfen der XML-Dateien verabeiten will…

feedback://showreport?report_id=34713

Bitte hängt euch da dran, wenn ihr auch den Fix benötigt!

wie wre es mit einem Beispielprojekt, was crasht?

Wenn du ein Value auslesen willst wo keines vorhanden ist:

firstname=contacts.Child(1).FirstChild.Value

Wenn kein Wert oder nur Blanks vorhanden ist crashed Xojo mit NIL

moment, ist das überhaupt ein Problem?

Weil wenn da kein Child ist, dann liefert FirstChild wohl immer nil.

das Child ist doch da, nur ohne Inhalt…
Wie soll denn das anders gehen, da gibt es 10 Childs, die sind immer fest, manchmal haben einige keinen Inhalt…

hast du 10 Zeilen code, die das zeigen?
Könnte ja ein Bug sein, aber so schwer zu raten.

[code] dim s as string = “”
dim d as new XmlDocument(s)
dim f as XmlNode = d.FirstChild

MsgBox f.Name

Break[/code]

So das zeigt “firstname” als Tag an und da ist kein Child drin, weil ja oben im xml nix dazwischen ist.

bei

dim s as string = "<firstname>Hello</firstname>"

hast du noch ein Textnode drin mit dem Value “Hello”.

also hier der Abschnitt für contact etwas gekürzt

m
Thomas
Mustermann

Muselstr. 22
22222
Wilhelmshaven

Mein code, der in dem Beispiel bei mit Nil abstürzt sieht so aus:
contacts=orders.FirstChild
contact_id=contacts.GetAttribute(“id”)
gender=contacts.child(0).FirstChild.Value
firstname=contacts.Child(1).FirstChild.Value
lastname=contacts.Child(2).FirstChild.Value
company=contacts.Child(3).FirstChild.value
street=contacts.Child(4).FirstChild.Value
zip=contacts.Child(5).FirstChild.Value
city=contacts.Child(6).FirstChild.Value

ja, du hast Recht, das Node wird mit Namen angezeigt, sobald ich aber den Value haben will ist es NIL wenn keines drin steht bzw. ein Blank drin steht

du musst deinen code vielleicht mal umbauen.
Vielleicht schreibst du dir eine Funktion ala

XMLTextNode(contacts, “zip”)

dann kann die Funktion die children durchgehen, nach dem Node mit dem Namen suchen und schauen, ob da text drin ist und den zurück geben.

Wenn es kein Child.FirstChild (XmlNode-Objekt) gibt, so ist es NIL. Und daher ist die “Nil Object Exception” korrekt - denn ohne FirstChild gibt’s kein .Value desselben.

Zwei “Autsches” im Code-Beispiel:

  1. Wenn da z.B. mal das ganze Element fehlen sollte, so stimmen smtliche weiteren Angaben nicht mehr, da Child(4) nicht mehr die Strasse wre. Also lieber mit Namen der Elemente prfen.
  2. Child(x).FirstChild.Value -> da kann immer eine NilObjectException passieren - es wird nicht geprft, ob’s ein FirstChild gibt.

So auf die Schnelle als Idee:

[code] Dim sXMLContact As String = “<contact id=”“120344"”>mThomasMustermannMuselstr. 2222222Wilhelmshaven"

Dim xmlDoc As New XmlDocument(sXMLContact)
Dim xmlContact As XmlNode = xmlDoc.FirstChild

Dim sInfos() As String
Dim sID As String = xmlContact.GetAttribute(“id”)
if (sID <> “”) then
sInfos.Append("ID: " + sID)
Dim oCurrentContactChild As XmlNode
for i As Integer = 0 to (xmlContact.ChildCount - 1)
oCurrentContactChild = xmlContact.Child(i)
select case oCurrentContactChild.Name
case “gender”, “firstname”, “lastname”, “company”, “street”, “zip”, “city”

    if (oCurrentContactChild.FirstChild <> nil) then
      sInfos.Append(oCurrentContactChild.Name + ":" + oCurrentContactChild.FirstChild.Value)
    else
      sInfos.Append(oCurrentContactChild.Name + ": (is empty)")
    end if
  end select
next
MsgBox Join(sInfos, EndOfLine)

end if[/code]

Also die XML-Datei ich ich da auslese, ist immer die gleiche, da ndert sich nichts dran. Die Nodes sind immer alle vorhanden, nur eben manchmal leer. Da auch ein Nil bei einem Blank kommt, gehe ich einfach mal von einem Bug aus.

Ich umschiffe das da bereits, indem ich alle leeren Nodes mit einem aufflle…

Fr mich bleibt es ein Bug!

Danke fr die Lsungsvorschlge

Dein Code prüft doch die child.names … und die sind doch immer da… nur manchmal leer…

Das Beispiel-Code prüft, ob ein .Child mit Namen “company”, “firstname”, usw. hat.

Falls ja, z.B. bei “company”
contacts.child(3) ist:

Der inhalt ist “leer” (es steht nichts drin) -> es gibt also kein .FirstChild (Objekt). Aus “nichts” kann kein Objekt erstellt werden.
Das Value von contacts.child(3) ist leer -> das .FirstChild (Objekt) ist NIL.
Soweit alles korrekt und aus meiner SIcht ganz klar kein Bug.

Daher ist die NilObjectException korrekt und erwartet:
contacts.Child(3).FirstChild (= NIL!).value

Danke…