Zurück   Flashforum > Flash und Server > Flash mit XML und Webservices

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 18-08-2010, 21:57   #1 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 552
XML einladen und in Array wandeln

Hallo,

ich habe eine ganz simple XML-Datei (beispielhaft verkürzt):
PHP-Code:
<?xml version="1.0" encoding="UTF-8"?>
<data>
    <kurs>
        <ask>1,27905</ask>
        <bid>1,27885</bid>
        <zeitstempel>17.08.2010 00:00:01</zeitstempel>
    </kurs>
    <kurs>
        <ask>1,279</ask>
        <bid>1,2788</bid>
        <zeitstempel>17.08.2010 00:00:29</zeitstempel>
    </kurs>
    <kurs>
        <ask>1,27905</ask>
        <bid>1,27885</bid>
        <zeitstempel>17.08.2010 00:00:30</zeitstempel>
    </kurs>
</data>
Ich möchte diese Datei einladen und in einem Array speichern:
PHP-Code:
var kurse:Array = new Array()
kurse[0].ask "1,27905"
kurse[0].bid "1,27885"
kurse[0].zeitstempel "17.08.2010 00:00:01"
kurse[1].ask "1,279"
kurse[1].bid "1,2788"
kurse[1].zeitstempel "17.08.2010 00:00:29"
... 
eigentlich doch eine ganz simple Angelegenheit, aber irgendwie bin ich zu blöd (?)

Mein Script zum einladen sieht so aus:
PHP-Code:
kursdatenXML = new XML();
kursdatenXML.ignoreWhite true;
kursdatenXML.onLoad = function() {
    
listXML(kursdatenXML);
};
kursdatenXML.load("data/kursdaten.xml");
function 
listXML(obj:Object) {
    
trace(typeof (obj));
    
trace(obj);

per trace ausgegeben wird folgendes:
PHP-Code:
object
<?xml version="1.0" encoding="UTF-8"?>
<data><kurs><ask>1,27905</ask><bid>1,27885</bid><zeitstempel>17.08.2010 00:00:01</zeitstempel></kurs>
<kurs><ask>1,279</ask><bid>1,2788</bid><zeitstempel>17.08.2010 00:00:29</zeitstempel></kurs>
<kurs><ask>1,27905</ask><bid>1,27885</bid><zeitstempel>17.08.2010 00:00:30</zeitstempel></kurs>
</data>
wenn ich jetzt die Funktion listXML(obj:Object) erweitere:
PHP-Code:
function listXML(obj:Object) {
    
trace(typeof (obj));
    
trace(obj);
    for (
att in obj) {
        
trace(typeof (att)+" "+att+" = "+obj[att]);
    }

dann bekomme ich aber die ganzen (für mich momentan unwichtigen) anderen Attribute ausgegeben:
PHP-Code:
string namespaceURI null
string localName 
null
string prefix 
null
string previousSibling 
null
string parentNode 
null
string nodeValue 
null
string nodeType 
1
string nodeName 
null
string nextSibling 
null
string lastChild 
= <data><kurs><ask>1,27905</ask><bid>1,27885</bid><zeitstempel>17.08.2010 00:00:01</zeitstempel>
... 
Wie muss ich jetzt die Funktion listXML(obj:Object) programmieren, um möglichst einfach an die entscheidenden XML-Daten zu kommen?
(Habe schon mehrere Versuche mit obj.lastChild/obj.firstChild durch)
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Alt 18-08-2010, 22:03   #2 (permalink)
mod_rewrite
 
Benutzerbild von sonar
 
Registriert seit: Feb 2003
Ort: München
Beiträge: 15.621
Hier gibt's ein gutes XML-Grundlagen-Tutorial:
[TUTORIAL] laden und verarbeiten von XML Dateien (basics) - Flashforum
__________________
RTFM
Wie man Fragen richtig stellt.

Achim Bindannmalweg

Money makes the world go round, fear makes it turn much faster.
(New Model Army)
sonar ist offline   Mit Zitat antworten
Alt 26-08-2010, 11:11   #3 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 552
Vielen Dank für den Hinweis.

Das Tutorial hatte ich mir schonmal angesehen. Ich arbeite aber nicht täglich mit Flash/XML, daher habe ich immer mal wieder Probleme mit der Terminologie (firstChild/childNodes).

Mit diesem Code komme ich an die entsprechenden Werte:
PHP-Code:
for (var 0i<obj.firstChild.childNodes.lengthi++) {
        var 
ask:String obj.firstChild.childNodes[i].childNodes[0].firstChild;
        var 
bid:String obj.firstChild.childNodes[i].childNodes[1].firstChild;
        var 
ts:String obj.firstChild.childNodes[i].childNodes[2].firstChild;
    } 
Wenn ich allerdings die Variablen ask und bid als Number haben möchte, muss ich diesen Umweg gehen:
PHP-Code:
var ask:Number Number(String(obj.firstChild.childNodes[i].childNodes[0].firstChild)); 
also zuerst in einen String wandeln und dann in eine Number, das hier:
PHP-Code:
var ask:Number Number(obj.firstChild.childNodes[i].childNodes[0].firstChild); 
gibt mir ask als NaN aus.
Hinweis: in der XML-Datei wurden die numerischen Werte korrigiert -> statt Komma ein Punkt: 1,27905 zu 1.27905


An anderer Stelle habe ich eine Webservice-Abfrage, welcher mir auch eine Antwort in XML-Form liefert (gleiche XML-Struktur wie oben). Die kann ich aber viel "angenehmer" verarbeiten. Der Antwortlistener sieht dabei so aus:
PHP-Code:
function wscListener(obj:Object) {
    var 
res:Object obj.target.results;
    var 
len:Number res.length;
    
trace("len: "+len);
    for (var 
0i<leni++) {
        
kurse[i] = new Object();
        
kurse[i].ask Number(res[i].Ask);
        
kurse[i].bid Number(res[i].Bid);
        
kurse[i].zeitstempel String(res[i].Timestamp);
    }

Da ich die Knotenbezeichner kenne, kann ich damit direkt auf die Werte zugreifen. Ich hatte gehofft, es gäbe für das normale Einladen einer XML-Datei eine ähnliche Lösung.

Deswegen habe ich mal versucht, dass mit dem XMLConnector zu machen, da dieser von der Struktur her dem WSConnector gleicht:
PHP-Code:
import mx.data.components.XMLConnector;
var 
xmlListener:Object = new Object();
xmlListener.result = function(obj:Object) {
    var 
res:Object obj.target.results;
    
trace(typeof (res));
    
trace(res); 
    
trace(res.length); 
    for (
att in res) {
        
trace(typeof (att)+"    "+att+" = "+res[att]);
    } 
};
var 
myXMLConnector:XMLConnector = new XMLConnector();
myXMLConnector.addEventListener("result"xmlListener);
myXMLConnector.direction "receive";
myXMLConnector.URL "data/kursdaten.xml";
myXMLConnector.multipleSimultaneousAllowed false;
myXMLConnector.suppressInvalidCalls true;
myXMLConnector.trigger(); 
...aber damit habe ich es bisher gar nicht geschafft, die einzelnen Daten aus den results zu extrahieren. Da gibt's wohl doch noch ein paar Unterschiede zum WSConnector
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Alt 26-08-2010, 12:38   #4 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 434
Arbeite mal mit for each, elements und der Punkt Notierung, das ist einfacher als mit firstChild, childNotes, etc. Zumal du ja deine Node Names kennst.

PHP-Code:
var kurse:Array = new Array()
var 
myXML :XML // hier deine eingelesene XML speichern.
for each ( var kursNode:XML in myXML.elements("kurs")) 
{
    var 
kursObj :Object = new Object();
    
kursObj.ask Number(kursNode.ask.toString());
    
kursObj.bid Number(kursNode.bid.toString());
    
kursObj.tskursNode.zeitstempel.toString();
    
    
kurse.push(kursObj);

Den Zeitstempel String könntest du ggf. sogar zu Date umwandeln, da gibts imho auch ne Funktion für.
Lukas78 ist offline   Mit Zitat antworten
Alt 27-08-2010, 15:22   #5 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 552
Zitat:
Zitat von Lukas78 Beitrag anzeigen
Arbeite mal mit for each, elements und der Punkt Notierung, das ist einfacher als mit firstChild, childNotes, etc. Zumal du ja deine Node Names kennst.
Ja, da ich die NodeNames kenne dachte ich auch, dass ich direkter, sprich mit dem Punkt-Operator Zugriff nehmen kann.

Dein for-each Beispiel ist AS 3 (?)

Leider habe ich es immer noch nicht geschafft, mich richtig in AS3 einzuarbeiten. Insofern kann ich Dein Beispiel nicht so ohne weiteres anwenden. (Ich bekomme einige Fehlermeldungen wenn ich mein Script unter Flash CS4 teste und müsste da an anderen Stellen noch Anpassungen vornehmen.)
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
eindim array in zweidim array wandeln hds26846 Flash 8 2 03-09-2009 17:52
string in ein Array mit Number-Inhalten wandeln headkit ActionScript 2 4 14-08-2008 13:32
m4p in wmv wandeln Joppejoe Sound 4 07-01-2008 13:34
Dynamisches PHP Array in String wandeln (mit | Trennung) FaTaL-eRoR PHP und MySQL 2 26-08-2007 08:15
array-inhalt dynamisch zu varibalen wandeln medien_freak ActionScript 1 2 09-08-2005 08:51


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele