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…
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…
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
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:
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.
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)
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…
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