Avatar billede yezbarh Nybegynder
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.
Avatar billede yezbarh Nybegynder
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
Avatar billede yezbarh Nybegynder
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";


    }

?>
Avatar billede whatever Nybegynder
03. februar 2006 - 21:26 #3
Hvordan ser hele din index.php fil ud?
Avatar billede olebole Juniormester
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>
Avatar billede yezbarh Nybegynder
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.
Avatar billede olebole Juniormester
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)
Avatar billede yezbarh Nybegynder
05. februar 2006 - 21:15 #7
Jeg vil prøve videre så :-)
Smid svar Ole.
Avatar billede olebole Juniormester
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>&nbsp;</a>
</div>
Avatar billede olebole Juniormester
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
Avatar billede yezbarh Nybegynder
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å..
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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

Seneste spørgsmål Seneste aktivitet
19 min siden Libre Office Impress Af Frank i Andre styresystemer
I dag 11:47 VB script Af Jenshentze i Word
I dag 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel