Avatar billede kalleballe Nybegynder
06. november 2003 - 11:09 Der er 20 kommentarer og
1 løsning

sortering af xml data

Jeg har noget xml:


<projekt>
    <fase faseID=1>
        <aktivitet aktivitetLabel=1 />
        <aktivitet aktivitetLabel=2 />
        <aktivitet aktivitetLabel=3 />
    </fase>
    <fase faseID=2>
        <aktivitet aktivitetLabel=1 />
        <aktivitet aktivitetLabel=2 />
    </fase>
</projekt>


Jeg kan godt få alle data ind i min fil, - problemet er at jeg ikke kan finde ud af at knytte aktivitet til faseID.


Altså så jeg får noget lignende:    aktivitet1 = (1,2,3);
               
                    aktivitet2 = (1,2);


Som der er nu har jeg bare:

projekt = projekt

faseID = 1,2

aktivitet = 1,2,3,1,2



Barklund har før hjulpet mig med noget lignende her:

http://www.eksperten.dk/spm/368707


men jeg kan ikke få det til at virke med den kode..


Mange venlige hilsner

KalleBalle
Avatar billede barklund Nybegynder
06. november 2003 - 11:44 #1
Du vil have for eksempel:

faser[1] = [1,2,3];
faser[2] = [1,2];

Som resultat?

Og du henter fra en ekstern fil?
Avatar billede kalleballe Nybegynder
06. november 2003 - 11:47 #2
ja, - og faktisk skal jeg så lave xml dataen om så tree komponentet kan forstå det ;-)

men det er jo et andet problem...
Avatar billede kalleballe Nybegynder
06. november 2003 - 12:00 #3
Jeg henter først min parent ind:
altså projekt, - og jeg har en attributes som vi kan kalde projektText

Jeg løber xmlen igennem med

XMLNode.prototype.sendNodes = function(searchName, callback) {
    // Send all nodes matching searchName
    // to the client's callback function.
    // Recurse to visit all nested nodes
    for (var i = 0; i<this.childNodes.length; i++) {
        var currentNode = this.childNodes[i];
        //
        //
        if (currentNode.nodeName == searchName) {
            callback(currentNode);
        }
        //
        if (currentNode.childNodes.length>0) {
            currentNode.sendNodes(searchName, callback);
        }
    }
};

efter kald med

myDoc.sendNodes("Project", handleProject);

Når den finde en post, altså et project tag så:

function handleProject(node) {
    project.push(node.attributes["ProjectText"]);
    myTreeDP.addTreeNode(String(project), 0);
}

og det samme med de andre poster, - det fede ville være hvis man kunne lave den rigtige struktur med det samme.

Min næste post bliver behandlet således når den er fundet:

function handlePhase(node) {
    var myTreeNode = myTreeDP.firstChild;
    fase = (node.attributes["FaseText"]);
    myTreeNode.addTreeNode(String(fase), 1);
    var nodes = myTreeNode.getTreeNodeAt(m);
    myTree.setIsBranch(nodes, true);
    m++;
}

Og så er problemet bare at jeg for de næste siblings ikke kan finde ud af at få dem proppet ind i de rigtige firstChilds...
Avatar billede kalleballe Nybegynder
06. november 2003 - 12:01 #4
hvis man kan sige de sådan ;-)
Avatar billede barklund Nybegynder
06. november 2003 - 12:04 #5
Så er det bare:

hentFaser = new XML();
hentFaser.onLoad = function(s) {
    if (!s) return false;
    faser = new Array();
    var top = this.firstChild.childNodes;
    var i, n, j, a;
    for (i = 0; i < top.length; i++) {
        n = top[i];
        a = faser[n.attributes.faseId] = new Array();
        for (j = 0; j < n.childNodes.length; j++) {
          a.push(n.childNodes[j].attributes.aktivitetLabel);
    }
    trace(faser.join("\n"));
}
hentFaser.ignoreWhite = true;
hentFaser.load("some.xml");
Avatar billede kalleballe Nybegynder
06. november 2003 - 12:05 #6
tak, - jeg prøver det :-)
Avatar billede kalleballe Nybegynder
06. november 2003 - 12:18 #7
hm, - jeg kan ikke rigtig få det til at virke, - jeg får bare en blank skræm..
Avatar billede kalleballe Nybegynder
06. november 2003 - 12:48 #8
Hvis jeg skriver:

trace("n attributes = " +n.firstChild.nextSibling.attributes.faseID);

så får jeg en værdi.

Så hvad skal jeg lave om i dit script??
Avatar billede barklund Nybegynder
06. november 2003 - 17:10 #9
Ah, top skal være:

var top = this.firstChild.firstChild.childNodes;

Tror jeg måske... :)
Avatar billede kalleballe Nybegynder
07. november 2003 - 09:49 #10
Her er mit resultat:

undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
rigtigPost1
rigtigPost2,rigtigPost3

Altså... det virker NÆSTEN.... hehe

Hvis jeg er heldig så crasher flash ikke, - jeg får altså en meget lang liste (jeg har ikke medtaget alle) undefined og så det rigtige resultat ??

hentFaser = new XML();
hentFaser.onLoad = function(s) {
    trace("s = "+s);
    if (!s) {
        return false;
    }
    faser = new Array();
    var top = this.firstChild.firstChild.childNodes;
    trace("top = " +top);
    trace("top length = " +top.length);
    var i, n, j, a;
    for (i=0; i<top.length; i++) {
        n = top[i];
        a = faser[n.attributes.faseID]=new Array();
        trace("n.childNodes.length = " +n.childNodes.length);
        for (j=0; j<n.childNodes.length; j++) {
            a.push(n.childNodes[j].attributes.myActivity);
        }
    trace(faser.join("\n"));


       
    }
};

lidt sjovt når top.length = 3, - måske er det n.childNodes.length der driller...
hentFaser.ignoreWhite = true;
hentFaser.load("testXML.xml");
Avatar billede barklund Nybegynder
07. november 2003 - 10:53 #11
Hvilken version af flash bruger du?
Avatar billede kalleballe Nybegynder
07. november 2003 - 11:10 #12
mx 2004 prof
Avatar billede barklund Nybegynder
07. november 2003 - 11:22 #13
Hmm... Kan du vise mig et eksempel på den korrekte XML? (altså ikke bare noget magen til, men det rigtige). Du kan maile det, hvis det er hemmeligt :)

Prøv at bruge denne:

    if (!s) {
        return false;
    }
    faser = new Array();
    var top = this.firstChild.firstChild.childNodes;
    trace("top length = " +top.length);
    var i, n, j, a;
    for (i=0; i<top.length; i++) {
        n = top[i];
        trace("top["+i+"] = "+n.nodeName);
        a = faser[n.attributes.faseID]=new Array();
        trace("n.childNodes.length = " +n.childNodes.length);
        for (j=0; j<n.childNodes.length; j++) {
            trace("aktiv = "+n.childNodes[j].attributes.myActivity);
            a.push(n.childNodes[j].attributes.myActivity);
        }
    // trace(faser.join("\n"));
Avatar billede kalleballe Nybegynder
07. november 2003 - 11:46 #14
okay, - ser lige på det og hvis det ikke virker, - jammen så 'you've got new mail waiting'

vh

KalleBalle
Avatar billede kalleballe Nybegynder
07. november 2003 - 11:51 #15
Maestro, - det virker nu, - tak skal du ha'.  Go J dag ;-)
Avatar billede barklund Nybegynder
07. november 2003 - 12:21 #16
OK :)
Avatar billede barklund Nybegynder
07. november 2003 - 12:27 #17
Tark for points :)
Avatar billede kalleballe Nybegynder
07. november 2003 - 12:28 #18
det var da virkelig så lidt
Avatar billede kalleballe Nybegynder
11. november 2003 - 17:03 #19
Du Barklund, - kan du ikke lige sige mig hvordan jeg også får
ActivityText ud af den videre xml....

Altså på samme måde som vi fik aktiv ud under hvert sit fase ID???

<Activity myActivity="blablabla">
<Activity ActivityID="12370" ActivityText="tekst1" />
<Activity ActivityID="26097" ActivityText="tekst2" />
<Activity ActivityID="33679" ActivityText="tekst3" />
</Activity>

Mange tak

KalleBalle
Avatar billede barklund Nybegynder
11. november 2003 - 17:13 #20
Jo, men i hvilket format ønsker du det?
Avatar billede kalleballe Nybegynder
11. november 2003 - 18:30 #21
Det ville jo være dejligt hvis jeg kunne få det på denne måde:
faseID1 = "1"
faseID1_myActivity = "blablabla"
faseID1_ActivityText1 = "tekst1"
faseID1_ActivityText2 = "tekst2"
faseID1_ActivityText3 = "tekst3"

altså en eller anden form for multidimensionel array??

Jeg forsøger jo at lave en menu, - og mine faser er top menu items, - min myActivity er subItem og min ActivityText er så subsubItem.

Nå, men mange tak fordi du gider at hjæpe mig ;-)

vh

KalleBalle
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester