Wie Sie bemerkt haben, kann die automatische Änderung von XML- und XMLList-Typen ziemlich verwirrend sein. Solche Dinge passieren, wenn clevere Programmierer (die hier auf Adobe verweisen ...) Convenience Wrapper um Dinge herum machen.
Was passiert ist eine Art "automatische Typumwandlung". Und es hört nicht auf den XML-Typ auf. Betrachten Sie dieses Beispiel XML:
<myXml>
<sound id="0">Boogaloo</sound>
<sound id="1">Bond theme</sound>
<sound id="2">2001</sound>
</myXml>
Lassen Sie uns sagen, ich habe die oben XML in einer Variablen myXml
genannt.Im folgenden Beispiel werden die E4X ein XMLList mit einem Element, und wir Zugriff auf das erste XML-Element mit [0]
:
trace(myXml.sound.(@id == 0)[0] == <sound id="0">Boogaloo</sound>);
// traces true
In diesem Beispiel auslassen wir den [0]
Teil, auf dem das automatische Umwandeln von Flash zu verlassen. Das eine Element zurückgegeben wird in XML konvertiert:
trace(myXml.sound.(@id == 0) == <sound id="0">Boogaloo</sound>);
// traces true
Aber in Fällen, in denen dies ein XML-Knoten angepasst enthält einen einfachen Textknoten konvertiert Flash automatisch die Art noch weiter in einen String:
trace(myXml.sound.(@id == 0) == "Boogaloo");
// traces true
Und Wenn der Textknoten als Zahl interpretiert werden kann (XML-Knoten mit der ID 2), konvertiert Flash ihn sogar weiter in eine Zahl!
trace(myXml.sound.(@id == 2) == 2001);
// traces true
Woot!
Also, was ist damit zu tun?
Wie Sie bemerkt haben, müssen Sie sehr vorsichtig mit Typen und der "praktischen" XML-Handhabung sein. Eine vorgeschlagene Praxis ist es, immer den Array-Zugriffsoperator zu verwenden, um den ersten XML-Element eines E4X Ergebnis zu zeigen, wenn Sie wissen, dass Sie ein einzelnes Ergebnis wollen:
config.users.admin[0].settings[0].email.(@type == "work")[0];
Es sieht auf den ersten seltsam, und fügt Ausführlichkeit die Code, aber der Vorteil ist, dass Sie explizit da sagen, dass Sie sich für einadmin
Element, einsettings
Element und einemail
Elemente vom Typ "work"
suchen. Und du gewöhnst dich daran.
Ein weiterer Tipp ist, sich immer an den Typ zu erinnern, den Sie verwenden möchten. Einige Beispiele:
allUsers = XMLList(config.users);
adminSettings = XML(config.users.admin[0].settings[0]);
adminWorkEmail = String(config.users.admin[0].settings[0].email.(@type == "work")[0]);
adminBirthYear = int(config.users.admin[0].birthdate[0][email protected][0]);
Hey Jon, ich habe keine Verwirrung über die XML-Klasse von AS2 übernommen, Die Verwirrung war, dass es ein XMLList und und XML-Klasse in AS3 Kern lib vorhanden ist. Die Beziehung zwischen diesen war für mich verwirrend. Ich sehe das als einen Fall von schlechter Benennung, Sie können meine Antwort oben sehen –