03. februar 2006 - 14:52
Der er
9 kommentarer og 1 løsning
Hente fra XML
Hejsa, hvis nu jeg har en fil "data.xml" som indeholder: <?xml version="1.0" encoding="iso-8859-1"?> <users> <user id="900"> asasas </user> <user id="901"> asasasa </user> <user id="902"> asasasa </user> <user id="903"> asasasa </user> <user id="904"> asasasa </user> <user id="905"> asasasa </user> </users> Hvordan får jeg så udskrevet alle brugerene fx. <a href="seprofil.php?id=ID">NAVN</a> .. ? Er ikke van til den måde, men vil begynde. Har læst php.net, men fandt ingen brugbare svar.
Annonceindlæg fra Cognizant
AI er ikke problemet. Eksekvering er.
Der bliver investeret massivt i AI. Teknologien er mere tilgængelig end nogensinde, og ambitionerne er høje. Alligevel oplever mange virksomheder, at resultaterne udebliver.
03. februar 2006 - 15:18
#1
Hov vent, min fil ser således ud: <?xml version="1.0" encoding="iso-8859-1"?> <users> <user id="100"> <navn>Jesper</navn> <tid>200001</tid> </user> <user id="101"> <navn>Jesper1</navn> <tid>2000011</tid> </user> <user id="102"> <navn>Jesper2</navn> <tid>2000012</tid> </user> </users> Og min php-fil: <body> <?php $xml = xmlize("data.xml"); $people = $xml["users"]["#"]["user"]; for($i = 0; $i < sizeof($people); $i++) { $person = $people[$i]; $age = $person["@"]["id"]; $name = $person["#"]["navn"][0]["#"]; $job = $person["#"]["tid"][0]["#"]; print "$name - $age - $job<br>\n"; } ?> men den siger bare den ikke kan finde funktionen! Fatal error: Call to undefined function: xmlize() in c:\programmer\easyphp1-8\www\xmltest\index.php on line 21
03. februar 2006 - 15:23
#2
hov, det passer ikke, manglede lige en del af filen :-) <?php function xmlize($data, $WHITE=1) { $data = trim($data); $vals = $index = $array = array(); $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, $WHITE); if ( !xml_parse_into_struct($parser, $data, $vals, $index) ) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); } xml_parser_free($parser); $i = 0; $tagname = $vals[$i]['tag']; if ( isset ($vals[$i]['attributes'] ) ) { $array[$tagname]['@'] = $vals[$i]['attributes']; } else { $array[$tagname]['@'] = array(); } $array[$tagname]["#"] = xml_depth($vals, $i); return $array; } function xml_depth($vals, &$i) { $children = array(); if ( isset($vals[$i]['value']) ) { array_push($children, $vals[$i]['value']); } while (++$i < count($vals)) { switch ($vals[$i]['type']) { case 'open': if ( isset ( $vals[$i]['tag'] ) ) { $tagname = $vals[$i]['tag']; } else { $tagname = ''; } if ( isset ( $children[$tagname] ) ) { $size = sizeof($children[$tagname]); } else { $size = 0; } if ( isset ( $vals[$i]['attributes'] ) ) { $children[$tagname][$size]['@'] = $vals[$i]["attributes"]; } $children[$tagname][$size]['#'] = xml_depth($vals, $i); break; case 'cdata': array_push($children, $vals[$i]['value']); break; case 'complete': $tagname = $vals[$i]['tag']; if( isset ($children[$tagname]) ) { $size = sizeof($children[$tagname]); } else { $size = 0; } if( isset ( $vals[$i]['value'] ) ) { $children[$tagname][$size]["#"] = $vals[$i]['value']; } else { $children[$tagname][$size]["#"] = ''; } if ( isset ($vals[$i]['attributes']) ) { $children[$tagname][$size]['@'] = $vals[$i]['attributes']; } break; case 'close': return $children; break; } } return $children; } function traverse_xmlize($array, $arrName = "array", $level = 0) { foreach($array as $key=>$val) { if ( is_array($val) ) { traverse_xmlize($val, $arrName . "[" . $key . "]", $level + 1); } else { $GLOBALS['traverse_array'][] = '$' . $arrName . '[' . $key . '] = "' . $val . "\"\n"; } } return 1; } traverse_xmlize($xml, "data.xml"); $xml = xmlize($data); $people = $xml["users"]["#"]["user"]; for($i = 0; $i < sizeof($people); $i++) { $person = $people[$i]; $age = $person["@"]["id"]; $name = $person["#"]["navn"][0]["#"]; $job = $person["#"]["tid"][0]["#"]; print "$name - $age - $job<br>\n"; } ?>
03. februar 2006 - 21:26
#3
Hvordan ser hele din index.php fil ud?
04. februar 2006 - 13:26
#4
<ole> Er det smart at lade serveren svede med at parse XML, når nu klientmaskinen står og strutter af ubrugt CPU og RAM? /mvh </bole>
05. februar 2006 - 10:42
#5
Har slet ikke forstand på det, det er første gang jeg er begyndt - så har slet ikke forstand.
05. februar 2006 - 10:58
#6
Prøv at Google lidt på emnet, der er oceaner af sider om XML-håndtering i de to store browsere ;o)
05. februar 2006 - 21:15
#7
Jeg vil prøve videre så :-) Smid svar Ole.
06. februar 2006 - 01:45
#8
Du kan prøve det her med xml-filen fra (03/02-2006 15:18:25): <script type="text/JavaScript"> var oTempl = null; function loadXml(sPath, fnCallBack) { var xmlDoc = null; if (window.ActiveXObject) { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.load(sPath); fnCallBack(xmlDoc); return true; } else if (document.implementation && document.implementation.createDocument) { xmlDoc = document.implementation.createDocument("", "", null); xmlDoc.load(sPath); xmlDoc.onload = function(){ fnCallBack(xmlDoc) }; return true; } return false; } function xmlCallBack(xmlDoc) { var oA, oTxt, aNodes, oName, oCont, docElm; docElm = xmlDoc.documentElement; oCont = document.getElementById("container"); aNodes = docElm.getElementsByTagName("user"); for (var i=0; i<aNodes.length; i++) { oName = aNodes[i].getElementsByTagName("navn")[0]; oA = oTempl.cloneNode(true); oA.firstChild.nodeValue = oName.firstChild.nodeValue; oA.setAttribute("href", "seprofil.php?id=" + aNodes[i].getAttribute("id")); oCont.appendChild(oA); } } window.onload = function() { var oA = document.getElementsByTagName("a")[0]; oTempl = oA.cloneNode(true); oA.parentNode.removeChild(oA); loadXml("test.xml", xmlCallBack); } </script> <div id="container"> <a> </a> </div>
06. februar 2006 - 02:56
#9
- spørg om det, du ikke forstår. Et enkelt hint: I XML- og HTML-DOM er alt noder. Et element er en element-node. Teksten i elementet er en text-node. Derfor den ved første øjekast lidt sære adressering: ELEMENT.firstChild.nodeValue Onload-handleren burde egentlig se sådan ud: window.onload = function() { var oA, oCont = document.getElementById("container"); oA = oCont.getElementsByTagName("a")[0]; oTempl = oA.cloneNode(true); oCont.removeChild(oA); loadXml("test.xml", xmlCallBack); } Jeg kloner a-elementet i divet og lægger klonen i den globale variabel 'oTeml'. Derefter fjerner jeg a-elementet fra divet. Nu har jeg en template, som jeg kan klone i for-løkken i funktionen 'xmlCallBack' - og indsætte i divet
06. februar 2006 - 13:32
#10
Havde ellers fundet noget godt i går :-) Men troede ikke man kunne i javascript, så det lyder sgu fantastisk.. det vil jeg da kigge på..
Vi tilbyder markedets bedste kurser inden for webudvikling