Lus in functie werkt niet??

Status
Niet open voor verdere reacties.

Edwin Noorlande

Nieuwe gebruiker
Lid geworden
8 jun 2010
Berichten
3
Waarom gaat de code hieronder niet goed?
Ik verwacht dat de structuur van de xml file gewoon te zien zou zijn.

Wie kan me helpen?

default.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<xml>
<domain>
<content></content>
<subdomain>
<content></content>
<subdomain>
<content></content>
<map>
<page></page>
<page></page>
<page></page>
<page></page>
</map>
</subdomain>
<map>
<page></page>
<page></page>
<page></page>
<page></page>
</map>
</subdomain>
<map>
<page></page>
<page></page>
<page></page>
<page></page>
<map>
<page></page>
<page></page>
<page></page>
<page></page>
</map>
</map>
</domain>
</xml>
[/XML]

index.html
[JS]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script language="javascript">

XMLfile = CreateAJAXObject();
XMLDoc = '';
XMLfile.onreadystatechange= view;
XMLfile.open("GET", './default.xml', true);
XMLfile.send(null);

function CreateAJAXObject(){
try{//Mozilla, Opera, and Safari
AJAXObj = new XMLHttpRequest(); }
catch (err){//Internet Explorer
try{ AJAXObj = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (err){
try{ AJAXObj = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (err){ alert("Your browser does not support AJAX!"); }
}
}
return AJAXObj;
}

function view(){
if (XMLfile.readyState == 4){
XMLDoc = XMLfile.responseXML;
index = readnode(XMLDoc.documentElement.firstElementChild);
document.getElementById('body').innerHTML = index;
}
}

function readnode(node){
nodename = node.tagName;
index = '<ul>';
index += '<li>'+nodename+'</li>';
if(node.children.length!=0){
for(x=0;x<node.children.length;++x){
index += readnode(node.children[x]);
}
}
index += '</ul>';
return index;
}

</script>
<title>test</title>
</head>
<body>
<div id="body"></div>
</body>
</html>
[/JS]
 
Het was even klooien, maar dit is het geworden. Het punt zit 'em in het feit dat je 2 items hebt steeds: een [object Element] en [object Text]. Hier eerst de correcte versie:[JS]
function readnode(node)
{
var i, tree = '<ul>';
var l = node.childNodes.length;

tree += '<li>' + node.tagName + '</li>';

for(i=1; i<l; i+=2)
{
tree += readnode(node.childNodes);
}

tree += '</ul>';

return tree;
}[/JS]als je deze versie gebruikt, zie je wat ik bedoel:[JS]
function readnode(node)
{
var i, tree = '<ul>';


var l = node.childNodes.length;


tree += '<li>' + node + '</li>';


for(i=1; i<l; i++)
{
tree += readnode(node.childNodes);
}

tree += '</ul>';


return tree;
}
[/JS]



:thumb:
 
Bedankt

Bedankt, ik zie het verschil maar ik weet nog niet helemaal waarom dit wel werkt? :(
Ik had toch allen de text nodes geteld??? volgens mij wil het kw... 20cent nog niet vallen. ;-)

het zit hem in childNodes he!! alle snap ik nu de for lus nog niet? :(
 
Laatst bewerkt:
Geen idee, maar blijkbaar werkt node.children niet goed. Had er ook nog nooit van gehoord. Het rare is ook dat als je de if weggehaald bij jou eerste versie, het script vastloopt.

De nieuwe for loop:[js] for(i=1; i<l; i+=2)[/js]het verschil zit m in i+=2. Dus elke iteratie telt ie er niet 1 bij op, maar 2. Dus i heeft de waardes 1, 3, 5, 7, etcetera. Dit heb ik zo gedaan omdat de childNodes[] stuctuur er zo uit ziet (zie dus 2e code die ik gaf):
Code:
text node
element node
text node
element node
text node
....
Nu loopt ie dus over deze allen, en pakt dus alleen alle element nodes.




:thumb:
 
Laatst bewerkt:
Thanks

Oke ik snap de for lus, zit nu alleen met het probleem dat ik deze XML uit een database krijgt en dus moet gaan kijken welk type node ik heb.

[XML]<?xml version="1.0" encoding="UTF-8"?><xml menuitemstrick="false" items="domain,subdomain,map,page" firstid="1"><domain id="1" adds="2,20" previd="" title="Domain 2" clientip="127.0.0.1" creationdate="1274907142" creatby="unknown" update="1275166984" updateby="unknown" skin="default"><content><![CDATA[test]]></content><subdomain id="2" adds="12,3" previd="1" title="subdomain 1" clientip="127.0.0.1" creationdate="1274281804" creatby="unknown" update="1274281867" updateby="unknown"><content><![CDATA[test]]></content><subdomain id="12" adds="" previd="2" title="Nieuwe subdomain" clientip="127.0.0.1" creationdate="1274739293" creatby="unknown" update="1274739322" updateby="unknown"><content><![CDATA[Nou Nou wat mooi]]></content></subdomain><map id="3" adds="7,6,4,5" previd="2" title="map 1" clientip="127.0.0.1" creationdate="1274281825" creatby="unknown" update="1274281877" updateby="unknown"><content><![CDATA[test]]></content><map id="7" adds="14,8" previd="3" title="map in map" clientip="127.0.0.1" creationdate="1274429786" creatby="unknown" update="1274429786" updateby="unknown"><content><![CDATA[]]></content><page id="14" adds="" previd="7" title="nieuwe pagina" clientip="127.0.0.1" creationdate="1274884978" creatby="unknown" update="1275548065" updateby="unknown" nextuntil="false" nextpage="true" prevpage="true" menu="true"><content><![CDATA[Weer een nieuwe pagina]]></content></page><page id="8" adds="11" previd="7" title="page" clientip="127.0.0.1" creationdate="1274429866" creatby="unknown" update="1274429866" updateby="unknown"><content><![CDATA[]]></content><segment id="11" adds="" previd="8" title="segment" position="" type="text"><content><![CDATA[]]></content></segment></page></map><page id="6" adds="" previd="3" title="page 3" clientip="127.0.0.1" creationdate="1274297182" creatby="unknown" update="1274297182" updateby="unknown"><content><![CDATA[]]></content></page><page id="4" adds="9,10" previd="3" title="page 4" clientip="127.0.0.1" creationdate="1274884070" creatby="unknown" update="1275548096" updateby="unknown" nextuntil="true" nextpage="true" prevpage="true" menu="true"><content><![CDATA[test]]></content><segment id="9" adds="" previd="4" title="segment" position="" type="text"><content><![CDATA[]]></content></segment><segment id="10" adds="" previd="4" title="segment" position="" type="text"><content><![CDATA[]]></content></segment></page><page id="5" adds="" previd="3" title="page 2" clientip="127.0.0.1" creationdate="1274281896" creatby="unknown" update="1274281896" updateby="unknown"><content><![CDATA[test]]></content></page></map></subdomain><subdomain id="20" adds="21,23,24" previd="1" title="nog een sub" clientip="::1" creationdate="1275308671" creatby="unknown" update="1275308671" updateby="unknown"><content><![CDATA[zie je wel]]></content><map id="21" adds="22" previd="20" title="mog en sub map" clientip="::1" creationdate="1275599761" creatby="unknown" update="1275599761" updateby="unknown"><content><![CDATA[]]></content><page id="22" adds="" previd="21" title="Pagina test" clientip="::1" creationdate="1275599824" creatby="unknown" update="1275599824" updateby="unknown" nextuntil="false" nextpage="true" prevpage="true" menu="true"><content><![CDATA[]]></content></page></map><map id="23" adds="" previd="20" title="map" clientip="::1" creationdate="1275599850" creatby="unknown" update="1275599850" updateby="unknown"><content><![CDATA[]]></content></map><subdomain id="24" adds="" previd="20" title="sub" clientip="::1" creationdate="1275599856" creatby="unknown" update="1275599856" updateby="unknown"><content><![CDATA[]]></content></subdomain></subdomain></domain></xml>[/XML]


Ik heb het nu zo opgelost. :)

[JS]
function readnode(node){
var x, index = '';
if(node.tagName){
index += '<ul><li>' + node.tagName + '</li>';
for(x=0; x<node.childNodes.length; x++){
index += readnode(node.childNodes[x]);
}
index += '</ul>';
}
return index;
}
[/JS]

Dit werkt, nu nog in m'n app verwerken.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan